在同一个SFSB中调用事务方法

时间:2011-11-03 22:43:02

标签: transactions ejb-3.0 java-ee-6 glassfish-3 stateful-session-bean

是否可以从有状态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。

1 个答案:

答案 0 :(得分:2)

它可能是Glassfish EJB实现中的一个错误。当您调用具有不同事务属性的方法时,它不会发生,它发生在对有状态会话bean的每次重入调用时。

尝试在您的有状态bean中添加一个简单的测试方法,并通过业务对象代理调用它。你会得到同样的例外。

在JBoss AS 7上,允许对有状态bean 进行可重入调用。顺便提一下,OpenEJB中出现了类似的错误:https://issues.apache.org/jira/browse/OPENEJB-1099