EJB @Asynchronous - 执行几分钟后,事务处于非活动状态

时间:2012-03-02 18:15:14

标签: java asynchronous transactions jboss ejb

我的单例会话bean中有一个异步方法,在执行几分钟后,在完成另一个事务的方法后抛出以下异常:

引起:org.jboss.util.NestedSQLException:事务处于非活动状态:tx = TransactionImple< ac,BasicAction:0:ffff0afd40ba:126a:4f50fff5:42状态:ActionStatus.ABORTED

我已尝试添加此anotation - @TransactionTimeout - 但不起作用。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

1.在transaction-jboss-beans.xml中配置默认​​超时:

<attribute name="TransactionTimeout">100</attribute>

2.使用BMT手动设置交易超时:

userTransaction.setTransactionTimeout(100);

3.在xml定义中超出会话bean的方法级别:

//--
    <method-attributes> 
       <method> 
         <method-name>someMethod</method-name> 
           <transaction-timeout>100</transaction-timeout> 
       </method> 
    </method-attributes>
//--

答案 1 :(得分:0)

是的,如果您不想调整标准超时,则可以使用注释@TransactionTimeout,该选项可以为特定业务方法设置交易超时。为此,JBoss / Wildfly提供了@TransacationTimeout批注。

开始之前,请确保已将依赖项添加到项目中:

<dependency>
    <groupId>org.jboss.ejb3</groupId>
    <artifactId>jboss-ejb3-ext-api</artifactId>
    <version>2.2.0.Final</version>
    <scope>provided</scope>
</dependency>

重要提示:

只有在交易开始时指定了注释,注释才适用。

在这种情况下,您将使用异步Bean启动新事务。因此,您也必须在那里进行配置。在下面的示例中,bean foo的方法SomeBean在5分钟后触发,lala的方法AsyncBean在10分钟后触发。

@Stateless
class SomeBean {

    @Inject
    AsyncBean asyncBean;

    @TransactionTimeout(value=5, unit= TimeUnit.MINUTES)
    public void foo() {
        asyncBean.lala()
    }
}
@Stateless
class AsyncBean {

    @Asynchronous
    @TransactionTimeout(value=10, unit= TimeUnit.MINUTES)
    public void lala() {
        ...
    }
}