2010-11-19 26 views
11

Java EE 6 CDI事件是事務性的嗎?Java EE 6 CDI事件是事務性的嗎?

如果我在事務中激發事件並隨後回滾事務,那麼Event偵聽器的效果是否也會回滾?

此行爲是否依賴於支持事務的事件偵聽器本身?

如果我嘗試回滾事件偵聽器中的異常,那麼是否回滾觸發事件的事務?

+0

代碼? (15小時) – Bozho 2010-11-19 19:17:37

+0

有關CDI活動製作人和聽衆的簡明代碼示例,請訪問:http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with – 2010-11-20 07:49:36

回答

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()。