2014-01-19 17 views
5

Ich habe eine Stateful EJB mit einer transaktionalen @Asynchronous Methode, die Future<T> zurückgibt.Was passiert, wenn eine statusbehaftete Bean während des Aufrufs der asynchronen Methode zerstört wird?

@SessionScoped 
@Named 
public class SessionBean { 
    @EJB 
    EjbService service 

    public void call() { 
    Future<Object> response = service.process(); 
    } 

} 

@Stateful 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class EjbService { 

    @Asynchronous 
    public Future<Object> process() { 
    // 
    } 

} 

Die Frage ist, was mit der Transaktion geschieht, wenn ein Benutzer die Web-Sitzung während der Ausführung dieser asynchronen Aufruf endet: Es wird von Web-Tier (@SessionScoped CDI Bean), wie unten gezeigt genannt?

Antwort

1

Die Methode @Asynchronous erstellt eine neue Transaktion (auch wenn die Klasse ein anderes Attribut hat, wird die TransactionAttributeType.REQUIRED trotzdem eine neue Transaktion erstellen). Wenn Sie get() Methode in Future<V> aufrufen, wird der Thread warten, bis das AsyncResult am Ende der Berechnung verfügbar wird. Danach kann der Stateful das Timeout ausführen und wird vom Container zerstört.

Wenn Sie nur die Async-Methode ausführen - ohne get() -, wird die Methode in die Warteschlange gestellt und verarbeitet, dann gilt das gleiche ... Stateful zerstört.

pro Tipp: Der EJB-Container verwaltet den Ergebniswert für vollständige asynchrone Aufrufe für eine bestimmte Zeit (diese Zeit ist nicht in der Spezifikation definiert).

Da eine neue Transaktion stattfindet und das Steuerelement sofort an den Client zurückgegeben wird (außer Aufruf get()), wurde die Transaktion ohne Ausnahmen in einem normalen Szenario abgeschlossen.