对于MDB的onMessage()
方法和SLSB和MDB的@Timeout
方法,都没有事务传播。也就是说,没有客户端执行该方法,因此无法传播事务。
使用容器管理的事务时,我希望这两种情况接受相同的javax.ejb.TransactionAttributeType
。但是,他们没有。
对于onMessage()
方法,REQUIRED和NOT_SUPPORTED是可接受的事务属性,而@Timeout
方法是REQUIRED,REQUIRES_NEW和NOT_SUPPORTED。
特别是对于规范所述的@Timeout
方法(参数18.2.8):
请注意,容器必须启动 如果需要新交易 (必需)事务属性是 用过的。此事务属性值 是允许的,以便规范 超时的事务属性 回调方法可以默认。
如果我正确地得到了这个,通常REQUIRES_NEW应该在这里使用,但因为REQUIRED是EJB的默认值,所以它也允许@Timeout
方法,赋予它与REQUIRES_NEW相同的语义,因为没有交易的可能性。
问题:
onMessage()
为什么不接受REQUIRES_NEW?在交易方面有什么不同吗?更新 对于支持REQUIRES_NEW的其他情况也是如此:@Asynchronous和@ PostConstruct / @ PreDestroy方法。
答案 0 :(得分:2)
是的,您的理解是正确的。
在我看来,@ Timeout对于指定REQUIRES_NEW来说很奇怪。规范基本上要求容器在超时方法的同一事务中更新持久性计时器数据库。这与事务性JCA消息传递没有任何不同,只是在JCA场景中更明显的是外部组件正在处理事务。我想你可能会说没有JavaEE组件驱动@Timeout方法,但在我看来,最好不要同时禁止REQUIRES_NEW。无论如何,不一致是奇怪的,因此可能会在规范的更高版本中更新MDB以允许REQUIRES_NEW。