Java EJB 3.x onMessage()与@Timeout事务上下文

Java EJB 3.x onMessage()与@Timeout事务上下文,java,transactions,jakarta-ee,ejb-3.0,ejb,Java,Transactions,Jakarta Ee,Ejb 3.0,Ejb,在EJB3.x中,对于MDB的onMessage()方法和SLSB和MDB的@Timeout方法,没有事务传播。也就是说,没有用于执行方法的客户机,因此事务不可能被传播 当使用容器管理的事务时,我希望这两种情况接受相同的javax.ejb.TransactionaAttribute类型。然而,他们没有 对于onMessage()方法,REQUIRED和NOT-SUPPORTED是可接受的事务属性,而对于@TimeoutREQUIRED方法,REQUIRED和NOT-SUPPORTED是可接受的事

在EJB3.x中,对于MDB的
onMessage()
方法和SLSB和MDB的
@Timeout
方法,没有事务传播。也就是说,没有用于执行方法的客户机,因此事务不可能被传播

当使用容器管理的事务时,我希望这两种情况接受相同的
javax.ejb.TransactionaAttribute类型。然而,他们没有

对于
onMessage()
方法,REQUIRED和NOT-SUPPORTED是可接受的事务属性,而对于
@Timeout
REQUIRED方法,REQUIRED和NOT-SUPPORTED是可接受的事务属性

特别是,对于规范所述的
@Timeout
方法(第18.2.8段):

请注意,容器必须启动一个 新事务处理(如果需要) (必需)事务属性为 用过。此事务属性值 是允许的,因此 超时的事务属性 回调方法可以是默认的

如果我理解正确,这里通常应该使用REQUIRES\u NEW,但是因为REQUIRED是EJB的默认值,所以
@Timeout
方法也允许使用REQUIRED\u NEW,这与REQUIRES\u NEW具有相同的语义,因为不可能传播事务

问题:

  • 我的理解正确吗
  • 为什么在
    onMessage()中不接受REQUIRES\u NEW?在交易方面有什么不同吗
  • 更新: 支持REQUIRES_NEW的其他情况也是如此:@Asynchronous和@PostConstruct/@PreDestroy方法

  • 是的,你的理解是正确的

  • 在我看来,@Timeout对于指定REQUIRES\u NEW来说很奇怪。该规范基本上要求容器在与超时方法相同的事务中更新持久计时器数据库。这实际上与事务性JCA消息传递没有什么不同,只是在JCA场景中,外部组件处理事务更为明显。我想您可能会争辩说,没有JavaEE组件驱动@Timeout方法,但在我看来,最好不允许两者都使用REQUIRES_NEW。无论如何,这种不一致性是很奇怪的,所以也许MDB将在规范的更高版本中更新,以允许新的需求

  • 谢谢你的回答(+1)。我会让它不受检查几天,看看是否有另一个答案。如果没有,我会检查它是否被接受。