2011-05-04 32 views
2

在EJB 3.x中對於onMessage()方法的MDBs和@Timeout方法的SLSB和MDB都沒有事務傳播。也就是說,沒有用於執行該方法的客戶端,所以事務不可能被傳播。EJB 3.x onMessage()vs @Timeout事務性上下文

當使用容器管理的交易時,我希望這兩個案例接受相同的javax.ejb.TransactionAttributeType。但是,他們沒有。

對於onMessage()方法,必需的和NOT_SUPPORTED在可接受的事務屬性的,而對於@Timeout方法所需,REQUIRES_NEW和NOT_SUPPORTED。

特別是,對於@Timeout方法的規範說(參數18.2.8):

注意,如果需要的 (必填)交易屬性是 使用的容器必須啓動一個新 交易。該事務屬性值 被允許,以便可以默認回調方法的 回調方法的 事務屬性的規範。

如果我得到這個正確,通常REQUIRES_NEW應在此處使用,但由於需要的是一個EJB的默認情況下,它也允許@Timeout方法,給它相同的語義爲REQUIRES_NEW,因爲沒有可能性要傳播的事務。

問題:

  1. 我的理解是否正確?
  2. 爲什麼REQUIRES_NEW在onMessage()中也不能接受?在交易方面它有什麼不同?

UPDATE: 也是一樣的,是支持REQUIRES_NEW其他情況:@Asynchronous和@ PostConstruct/@ PreDestroy方法。

回答

2
  1. 是的,你的理解是正確的。

  2. 在我看來,@Timeout對於指定REQUIRES_NEW很奇怪。該規範基本上要求容器更新與超時方法相同的事務中的持久計時器數據庫。這與事務性JCA消息傳遞沒有任何區別,只是在JCA方案中更明顯的是外部組件處理事務。我想你可以爭辯說,沒有JavaEE組件驅動@Timeout方法,但在我看來,最好不要使用REQUIRES_NEW。無論如何,這種不一致性很奇怪,因此MDB可能會在更新版本的規範中更新,以允許REQUIRES_NEW。

+0

感謝您的回答(+1)。我會在一段時間內不檢查它是否給出了另一個答案。如果不是,我會檢查它是否被接受。 – 2011-05-05 07:53:11

+0

答案已被接受! – 2011-05-10 13:57:49