2010-11-19 5 views
11

Java EE 6 CDIイベントはトランザクション処理されますか?Java EE 6 CDIイベントはトランザクション処理されますか?

トランザクションでイベントを発生させた後にトランザクションをロールバックすると、イベントリスナーの影響もロールバックされますか?

この動作は、トランザクションをサポートするイベントリスナー自体に依存しますか?

イベントリスナー内から例外をロールバックしようとすると、イベントを発生させたトランザクションはロールバックされますか?

+0

コード? (15chrs) – Bozho

+0

CDIイベントプロデューサとリスナーの簡潔なコード例は、http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_withで入手できます。 –

答えて

15

CDI 1.0仕様のevents chapterから、一方がTransactionPhaseいずれかを指定することにより、 "トランザクション" であるイベントを定義することができるTransactionPhaseのいずれかであり、観察された:

  • IN_PROGRESS、
  • BEFORE_COMPLETION、
  • AFTER_COMPLETION、
  • AFTER_FAILURE、
  • AFTER_SUCCESS

このような宣言は次のようになります。

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... } 

オブザーバーは、「トランザクション」であると宣言されていない場合、コンテナは、すぐにオブザーバーを呼び出し、それ以外の場合は、取引完了時に、後で呼び出しのオブザーバメソッドを登録JTA同期を使用している。

しかし:トランザクションの完了前に呼び出さ

任意観察方法は、トランザクションのロールバックを強制的にsetRollbackOnlyメソッド()を呼び出すことができます。オブザーバメソッドは、JTAトランザクションを直接開始、コミット、またはロールバックすることはできません。

オブザーバーメソッドが例外をスローした場合(それ自体が「トランザクション」でない場合)、例外はイベントの処理を打ち切ります。

私が探している振る舞いを達成するためには、私はオブザーバを「トランザクション型」として登録し、BEFORE_COMPLETION TransactionPhaseを指定すると信じています。その後、イベントを開始したトランザクションをロールバックしたい場合は、setRollbackOnly()を呼び出します。