WildFly如何处理@TransactionTimeout?



我想知道 WildFly 如何处理@TranscationTimeout,尤其是在调用另一个用@TransactionAttribute而不是@TransactionTimeout本身注释的 EJB 方法时。

我已经搜索了WildFly文档,API文档,当然还有谷歌搜索,但我找不到任何声明。

请考虑以下方案。我们有无状态的 EJB A 和 B。

@Stateless
public class A {
@Inject
private B b;
@TransactionTimeout(unit = TimeUnit.MINUTES, value = 10)
public void t() {
b.t();
}
}
@Stateless
public class B {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void t() {
}
}

当客户端调用时,我期望:

  • A::t 在超时为 10 分钟的事务中运行
  • B::t 在新事务中运行,容器默认超时(在 WildFly 中为 5 分钟(
  • A::t 中的 B::t 在自己的新事务中运行,容器默认超时(在 WildFly 中为 5 分钟(

发生什么:

  • A::t 中的 B::t 在自己的新事务中运行,超时为 10 分钟

似乎@TransactionTimeout继承到嵌套的 EJB 方法,如果它们没有以某种方式分别用 @TransactionTimeout 注释,则在调用它们时容器默认值将被覆盖。需要这种行为吗?有例外吗?

我正在运行带有Java 8的WildFly 10.1.0。

正如 TransactionTimeout-Annotation 所述:

"用于在调用 EJB 业务方法时指定新启动事务的事务超时的注释">

这意味着 imO:对于新启动的事务,而不是针对当前正在运行的事务。因此,B:t 会受到影响,因为它启动一个新事务,就像 A:t 一样,但前提是它在非事务上下文中调用。(默认@Requires可能意味着事务已在运行。

然后,这将符合您的观察结果。

相关内容

  • 没有找到相关文章

最新更新