我的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() {
...
}
}