0

次のような構造の EJB があるとします。

@Stateless
public class MyBean {
@PersistenceContext
private EntityManager entityManager;

    public void doSomething() {
        ...
        doAsynchronously();
        ...
        entityManager.persist(someObject);          
        ...
        if (...) {
            throw new RuntimeException();
        }
    }   

    public void doAsynchronously() {
        ...
        entityManager.persist(someOtherObject);
        ...
    }
}

同期部分で例外がスローされ、それによってトランザクションがロールバックされた場合、非同期呼び出しはその影響を受けず、そのメソッド内でエラーが発生しなければ、エンティティ マネージャーの操作は正しく終了するはずです。

非同期 Bean に関する多くの例を見つけましたが、どちらの場合もエンティティ マネージャーでの作業と組み合わせたものではありませんでした。


編集 2013/08/22:

追加の質問-コードフラグメントに示されているセットアップの全体的な理由はdoAsynchronously()、呼び出し元メソッドで例外が発生した場合でも、コードがエンティティでの操作を完全に終了できることを確認するためでした-同じ動作が得られますか? @Asynchronousannotate withを使用する代わりに@TransactionAttribute(REQUIRES_NEW)?

4

1 に答える 1

2

非同期メソッドは別のスレッドで実行されるため、現在のトランザクションのコンテキストでは実行されず、別の永続コンテキストも使用されます。

現在のトランザクションで発生する可能性のあるエラーの影響を受けずに、新しいトランザクションを開始することが目標である場合、REQUIRES_NEW は確かに解決策です。しかし、単純に REQUIRES_NEW を使用しても呼び出しは非同期になりません。新しいトランザクションが完成するまで現在のトランザクションがブロックされ、現在のトランザクションが再開されます。

于 2013-08-22T07:30:24.953 に答える