我的单例会话bean中有一个异步方法,在执行几分钟后,在完成另一个事务的方法后抛出以下异常:
引起:org.jboss.util.NestedSQLException:事务处于非活动状态:tx = TransactionImple< ac,BasicAction:0:ffff0afd40ba:126a:4f50fff5:42状态:ActionStatus.ABORTED
我已尝试添加此anotation - @TransactionTimeout - 但不起作用。
有什么想法吗?
感谢。
答案 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() {
...
}
}