Java EE 6 CDI事件是事務性的嗎?Java EE 6 CDI事件是事務性的嗎?
如果我在事務中激發事件並隨後回滾事務,那麼Event偵聽器的效果是否也會回滾?
此行爲是否依賴於支持事務的事件偵聽器本身?
如果我嘗試回滾事件偵聽器中的異常,那麼是否回滾觸發事件的事務?
Java EE 6 CDI事件是事務性的嗎?Java EE 6 CDI事件是事務性的嗎?
如果我在事務中激發事件並隨後回滾事務,那麼Event偵聽器的效果是否也會回滾?
此行爲是否依賴於支持事務的事件偵聽器本身?
如果我嘗試回滾事件偵聽器中的異常,那麼是否回滾觸發事件的事務?
從CDI 1.0規範的events chapter,可以通過指定TransactionPhase一個定義一個事件是 「事務」 是觀察,其中TransactionPhase是以下之一:
這樣的聲明如下:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
如果觀察者不聲明爲「交易」,然後將容器立即調用觀察者,否則在交易完成期間註冊了以後調用觀察者方法階段,使用JTA同步。
但是:
任何一個交易完成之前調用可以調用使用setRollbackOnly觀察者()方法來強制事務回滾。觀察者方法可能不會直接啓動,提交或回滾JTA事務。
如果觀察者方法拋出一個異常(並且它本身不是「事務性的」),異常會中止事件的處理。
所以,爲了達到我期待的行爲,我相信我會將我的觀察者註冊爲「事務性」,並指定BEFORE_COMPLETION TransactionPhase。如果我想回滾啓動事件的事務,那麼我會調用setRollbackOnly()。
代碼? (15小時) – Bozho 2010-11-19 19:17:37
有關CDI活動製作人和聽衆的簡明代碼示例,請訪問:http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with – 2010-11-20 07:49:36