java - Seam 交易和 Arjuna TransactionReaper

标签 java jboss transactions seam

所以在我正在处理的一个项目中,我有一个由 TimerService 触发并执行更新某些数据的方法的 Seam 组件。此方法通常运行几秒钟,但有时可能需要几分钟。

我的问题是,如果此方法花费的时间太长,Arjuna TransactionReaper 就会启动并终止该组件。默认超时设置为 5 分钟,这对所有其他组件来说已经足够了,我不想更改它。

这是我的代码的一些简单部分:

@Name("myComp")
@Stateful(mappedName = "myComp")
@Scope(APPLICATION)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionTimeout(timeout = 3600) //own implementation, used by Transaction class, see below
public class MyComp implements MyCompLocal
{
    @Override
    public void update() {/*...*/}
}

在 StackOverflow 的某个地方(我找不到包含这个的确切问题,否则我会链接到它)我找到了一个解决方案,听起来不错:Overwrite Seams Transaction 类并在 UserTransaction 上设置超时,所以我这样做了:

@Name("org.jboss.seam.transaction.transaction")
@Scope(ScopeType.EVENT)
@Install(precedence=APPLICATION)
@BypassInterceptors
public class Transaction extends org.jboss.seam.transaction.Transaction
{
    @Override
    protected UserTransaction getUserTransaction() throws NamingException
    {
        UserTransaction ut = super.getUserTransaction();
        ut.setTransactionTimeout(getTimeout()); //getTimeout() uses the value set by the TransactionTimeout annotation, done by analyzing the stacktrace and reflection
        return ut;
    }
}

从调用代码和在 UserTransaction 上设置超时的意义上来说,这实际上似乎是有效的。然而问题是 Arjuna 似乎并不关心这个,我仍然得到:

WARN  [arjuna] ARJUNA-12117 TransactionReaper::check timeout for TX 0:ffffc0a88364:126a:53eb7613:8a in state  RUN
WARN  [arjuna] ARJUNA-12095 Abort of action id 0:ffffc0a88364:126a:53eb7613:8a invoked while multiple threads active within it.
WARN  [arjuna] ARJUNA-12108 CheckedAction::check - atomic action 0:ffffc0a88364:126a:53eb7613:8a aborting with 1 threads active!
WARN  [arjuna] ARJUNA-12121 TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 0,5,jboss] successfully canceled TX 0:ffffc0a88364:126a:53eb7613:8a
WARN  [arjuna] ARJUNA-12117 TransactionReaper::check timeout for TX 0:ffffc0a88364:126a:53eb7613:8b in state  RUN
WARN  [arjuna] ARJUNA-12095 Abort of action id 0:ffffc0a88364:126a:53eb7613:8b invoked while multiple threads active within it.
WARN  [arjuna] ARJUNA-12108 CheckedAction::check - atomic action 0:ffffc0a88364:126a:53eb7613:8b aborting with 1 threads active!
WARN  [arjuna] ARJUNA-12121 TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 0,5,jboss] successfully canceled TX 0:ffffc0a88364:126a:53eb7613:8b

恰好在方法被调用五分钟后。 因此,Arjuna 似乎根本不关心 UserTransaction 上的超时设置。有什么提示可以帮助我解决这个问题吗?

顺便说一句:JBossAS 6.1.0.Final、jdk_1.7.0_13、JBossTS 4.14.0.Final、Seam 2.2.2.Final

最佳答案

您不能为每个资源管理器设置超时(如果这是您尝试做的)但您可以为每个事务设置它(在调用 UserTransaction.begin 之前)

关于java - Seam 交易和 Arjuna TransactionReaper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302790/

相关文章:

java - RestFB:Facebook HTTP 400 错误不够具体

java - 如何在 Windows 上启动 JBoss AS 7.1.1?

java - 事务和分离对象 JPA

java - 如何进入不受密码保护的 Java keystore 或更改密码?

java - 带有 mongo atlas 的 Spring Boot 不起作用

java - EJB 无状态 session bean 为 null

postgresql - 在 PostgreSQL 中创建一个永不回滚的存储过程?

java - 传播设置为 Propagation.NOT_SUPPORTED 时的 Hibernate 和 TransactionRequiredException

java - 将 rmi 接口(interface)转换为 CORBA .idl

ruby-on-rails - 在 jboss 7 中配置 SSL