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



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

由:org.jsboss.util.NestedQLException引起:事务未激活:tx=TransactionImple<ac,基本操作:0:ffff0afd40ba:126a:4f50fff5:42状态:操作状态。中止

我已经尝试添加这个站@TransactionTimeout,但不起作用。

知道吗?

谢谢。

1.在transaction-joss-bans.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>
//--

是的,如果您不想调整标准超时,可以使用注释@TransactionTimeout,可以为特定的业务方法设置事务的超时。为此,JBoss/Wardfly提供了@TransacationTimeout注释。

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

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

重要信息:

只有在事务开始时指定了注释,该注释才适用。

在您的案例中,您使用异步bean启动一个新事务。所以你也必须在那里进行配置。在下面的例子中,豆SomeBean的方法foo在5分钟后罢工,AsyncBean的方法lala在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() {
        ...
    }
}

相关内容

最新更新