【问题标题】:Seam Transactions and Arjuna TransactionReaperSeam Transactions 和 Arjuna TransactionReaper
【发布时间】:2014-10-07 19:03:57
【问题描述】:

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

我的问题是,如果这个方法花费的时间太长,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 上的某个地方(我找不到包含此问题的确切问题,否则我会链接到它)我找到了一个听起来不错的解决方案:覆盖 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

【问题讨论】:

  • 嗨!您找到解决方案了吗?我有一个非常相似的问题:stackoverflow.com/questions/28992996/…
  • 不,很遗憾我没有。到目前为止,我所做的是实现了一些变通方法,导致调用更小,在一种情况下,我实际上实现了内部超时,在这种情况下,我基本上在 Arjuna 能够启动之前停止了计算。这适用于我的情况,因为我基本上在工作在来自外部系统的 ping 调用上,如果其中一些在某些运行中掉线,则不会发生任何不好的事情。不过,它很丑,我想摆脱它。
  • 也许我的回答会对你有所帮助。我不知道我挂起事务的问题与 log4j 有关:stackoverflow.com/questions/28992996/…

标签: java jboss transactions seam


【解决方案1】:

您无法为每个资源管理器设置超时(如果您正在尝试这样做),但您可以为每个事务设置它(在调用 UserTransaction.begin 之前)

【讨论】:

  • 我应该说您需要在完成第一个后再次调用 setTransactionTimeout 将其重置为 5 分钟
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多