2014-01-19 12 views
5

トランザクション@AsynchronousメソッドがステートフルなEJBを持っていて、Future<T>を返しています。下図のようにWeb層(@SessionScoped CDI豆)から呼び出されています:@Asynchronousメソッド呼び出し中にステートフルBeanが破棄されるとどうなりますか?

@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() { 
    // 
    } 

} 

質問は、ユーザーがこの非同期呼び出しの実行中にWebセッションを終了した場合、トランザクションに何が起こるかですか?

答えて

1

@Asynchronousメソッドは新しいトランザクションを作成します(クラスに別の属性がある場合でも、TransactionAttributeType.REQUIREDは新しいトランザクションを作成します)。

Future<V>get()メソッドを呼び出すと、スレッドは計算の最後にAsyncResultが使用可能になるまで待機します。その後、ステートフルはタイムアウトを実行し、コンテナによって破棄されます。

Asyncメソッドを実行した場合(get()なし)、メソッドはキューに入れられ、処理され、同じことが適用されます。ステートフルが破棄されます。

pro tip:ejbコンテナは、特定の時間(この時間は仕様に定義されていません)で完全な非同期呼び出しの結果値を保持します。

まったく新しいトランザクションが発生し、制御はすぐにクライアントに返されます(get()を呼び出さない限り)、通常のシナリオではトランザクションは例外なく終了します。

関連する問題