是否可以从有状态EJB本身调用事务方法?更清楚地说:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Stateless
public class MyService {
@Resource
SessionContext ctx;
public void myMethod() {
// do something...
// invoke method from the same class
// As expected - this doesn't work as it's a regular local-call,
// it's not aware of EJB nature of this call.
save();
// Doesn't work (although it worked with SLSB)
ctx.getBusinessObject(MyService.class).save();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save() {
// do something...
}
}
现在我想要实现的是让用户调用myMethod();我想确保在没有JTA事务的情况下执行此方法。在这个调用之后我想调用save();将在交易中运行的方法。
如果我使用ctx.getBusinessObject( - )方法,我得到:
警告:在EJB上调用期间发生系统异常 MyService方法public void com.test.MyService.save() javax.ejb.IllegalLoopbackException:非法可重入访问:尝试 对方法'public void进行回调调用 com.test.MyService.save()用于有状态会话bean MyService
SFSB不支持内部调用吗?
我正在运行Glassfish 3.1.1。
答案 0 :(得分:2)
它可能是Glassfish EJB实现中的一个错误。当您调用具有不同事务属性的方法时,它不会发生,它发生在对有状态会话bean的每次重入调用时。
尝试在您的有状态bean中添加一个简单的测试方法,并通过业务对象代理调用它。你会得到同样的例外。
在JBoss AS 7上,允许对有状态bean 进行可重入调用。顺便提一下,OpenEJB中出现了类似的错误:https://issues.apache.org/jira/browse/OPENEJB-1099