【发布时间】:2018-03-16 17:34:19
【问题描述】:
我刚刚发现了一些让我很吃惊的 EJB 行为。
这里是代码示例(确定 MyBean、beanA、beanB 是使用 CMT 的 EJB):
@Stateless
public class MyBean {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myMethod(){
try {
beanA.methodA(); /* annotated as REQUIRED */
} catch (Exception e) {
beanB.methodB(); /* annotated as NOT_SUPPORTED */
}
}
}
假设methodA的执行时间超过了事务超时时间,所以一旦它返回myMethod就会收到TransactionRolledbackException,然后在“myMethod”中成功捕获。
到目前为止,我希望“methodB”被调用,因此根据 EJB 规范,它必须在没有任何事务上下文的情况下调用。 但实际上,“beanB”代理只是返回了另一个TransactionRolledbackException,“methodB”没有被执行。
查看 EJB 规范,我没有看到任何东西可以证明容器应该或什至可能以这种方式运行。
我错过了什么吗?任何提示将不胜感激。
更新
至少对于 Websphere,这种行为似乎是特定于超时的。例如,当“methodA”抛出 RuntimeException 时设置的“rollbackOnly”标志不会阻止“methodB”的执行。只有超时标志。
【问题讨论】:
标签: java jakarta-ee transactions ejb websphere