Java EE 6 CDI イベントはトランザクションですか?
-
26-09-2019 - |
質問
Java EE 6 CDI イベントはトランザクションですか?
トランザクションでイベントを発生させ、その後トランザクションをロールバックした場合、イベント リスナーの効果もロールバックされますか?
この動作は、トランザクションをサポートするイベント リスナー自体に依存しますか?
イベント リスナー内から例外をロールバックしようとすると、イベントを発生させたトランザクションはロールバックされますか?
解決
から イベントの章 CDI 1.0 仕様では、監視している TransactionPhase を指定することでイベントを「トランザクション」として定義できます。TransactionPhase は次のいずれかです。
- 進行中、
- BEFORE_COMPLETION、
- 完了後、
- AFTER_FAILURE、
- AFTER_SUCCESS
このような宣言は次のようになります。
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
オブザーバーが「トランザクション」であると宣言されていない場合、コンテナーはオブザーバーをすぐに呼び出します。それ以外の場合は、JTA 同期を使用して、後のトランザクション完了フェーズで呼び出すためにオブザーバー メソッドを登録します。
しかし:
どれでも トランザクションの完了前に呼び出されたオブザーバー メソッドは、setRollbackOnly() を呼び出してトランザクションのロールバックを強制する場合があります。オブザーバー メソッドは、JTA トランザクションを直接開始、コミット、またはロールバックすることはできません。
オブザーバー メソッドが例外をスローした場合 (それ自体が「トランザクション」ではない場合)、その例外によってイベントの処理が中止されます。
したがって、私が探している動作を実現するには、オブザーバーを「トランザクション」として登録し、BEFORE_COMPLETION TransactionPhase を指定すると思います。イベントを開始したトランザクションをロールバックしたい場合は、setRollbackOnly() を呼び出します。