gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:49:17 26 4
gpt4 key购买 nike

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

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

对于 onMessage() 方法,REQUIRED 和 NOT_SUPPORTED 是可接受的事务属性,而对于 @Timeout 方法,REQUIRED、REQUIRES_NEW 和 NOT_SUPPORTED。

特别是对于 @Timeout 规范所说的方法(par.18.2.8):

Note that the container must start a new transaction if the REQUIRED (Required) transaction attribute is used. This transaction attribute value is allowed so that specification of a transaction attribute for the timeout callback method can be defaulted.

如果我理解正确,这里通常应该使用 REQUIRES_NEW,但是因为 REQUIRED 是 EJB 的默认设置,所以 @Timeout 方法也允许使用它,赋予它与 REQUIRES_NEW 相同的语义,因为不可能传播交易。

问题:

  1. 我的理解正确吗?
  2. 为什么 REQUIRES_NEW 在 onMessage() 中也不被接受?在交易方面有什么不同吗?

更新:对于支持 REQUIRES_NEW 的其他情况也是如此:@Asynchronous 和@PostConstruct/@PreDestroy 方法。

最佳答案

  1. 是的,你的理解是正确的。

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

关于java - EJB 3.x onMessage() 与@Timeout 事务上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com