【问题标题】:JBoss EAP: @TransactionTimeout not affecting @Timeout Method?JBoss EAP:@TransactionTimeout 不影响@Timeout 方法?
【发布时间】:2016-12-19 16:00:18
【问题描述】:

这里有一段由 EJB 定时器触发的代码,运行在部署在 JBoss EAP 6.2 上的 EAR 中。

由于onTimeout(Timer timer) 方法中的处理可能比standalone.xml 中指定的默认事务超时时间长得多,所以我想出了这个解决方案:

//[...]
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.jboss.ejb3.annotation.TransactionTimeout;
//[...]

@Startup
@Singleton
public class DataqReaderServiceImpl extends AbstractDataqReaderService {

    @Resource
    private TimerService timerService;

    @Override
    @Timeout
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    @TransactionTimeout(unit = TimeUnit.MINUTES, value = 60)
    protected void onTimeout(Timer timer) {
    try {
            super.readDataq(timer);
        } catch (Exception e) {
            timer.cancel();
        }
    }
}
//[...]

但显然@TransactionTimeout 注释被忽略了。代码运行 5 分钟后,Transaction Reaper 开始运行:

2016-12-19 15:12:21,878 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff0a07065b:296fc7c:5857e084:67ef in state  RUN
2016-12-19 15:12:21,881 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012095: Abort of action id 0:ffff0a07065b:296fc7c:5857e084:67ef invoked while multiple threads active within it.
2016-12-19 15:12:21,881 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012108: CheckedAction::check - atomic action     0:ffff0a07065b:296fc7c:5857e084:67ef aborting with 1 threads active!
2016-12-19 15:12:21,882 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012121: TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 0,5,main] successfully canceled TX 0:ffff0a07065b:296fc7c:5857e084:67ef

我的错在哪里?

【问题讨论】:

标签: java jboss ejb jboss7.x jta


【解决方案1】:

在尝试了更多之后,我发现这似乎是 RedHat JBoss EAP 6.2 中的一个错误。

这是 EAP 6.2.0 上事务开始位置的跟踪日志:

2016-12-20 07:21:29,754 TRACE [com.arjuna.ats.arjuna] (EJB default - 10) TransactionReaper::insert ( BasicAction: 0:ffff0a07065b:-60e989f1:5858dbac:45 status: ActionStatus.RUNNING, 300 )
2016-12-20 07:21:29,754 TRACE [com.arjuna.ats.arjuna] (EJB default - 10) ReaperElement::ReaperElement ( BasicAction: 0:ffff0a07065b:-60e989f1:5858dbac:45 status: ActionStatus.RUNNING, 300 )

为 TransactionReaper::insert 记录的第二个参数是超时值。

现在这是同一事件的跟踪日志,但在 EAP 6.4.8 上(我验证了 6.2.0 和 6.4.8 实例中的默认超时设置为 300 秒):

09:12:52,913 TRACE [com.arjuna.ats.arjuna] (EJB default - 8) TransactionReaper::insert ( BasicAction: 0:ffff0a076537:-1ab57a18:5858f5d6:31 status: ActionStatus.RUNNING, 3600 )
09:12:52,913 TRACE [com.arjuna.ats.arjuna] (EJB default - 8) ReaperElement::ReaperElement ( BasicAction: 0:ffff0a076537:-1ab57a18:5858f5d6:31 status: ActionStatus.RUNNING, 3600 )

因此在 EAP 6.4.8 上使用正确的超时值启动事务。

【讨论】:

  • 我现在在 Wildfly 17.0.1 上遇到了类似的问题 - 在我的机器上它可以工作,而在我的 prod 系统(相同的 JDK,相同的 WF 版本)上,事务在 5 分钟后被终止。我什至在长时间运行的事务蚂蚁“getTimeout()”开始时插入了事务管理器的查找,得到了我正确的 3600 秒——但你的事务在 5 分钟(300 秒)后得到“收获”。完全错误:在长时间运行的任务中观察事务的状态会给出 Status.RUNNING (=0) - 这是不正确的。
  • 这真的很烦人,因为配置问题的测试需要很长时间......非常耗时。
  • 我现在已经“工作”了:我已将属性“default-timeout”添加到事务配置中以增加一般事务超时 (standalone.xml)。有趣的事实:似乎没有遵守这个默认超时 - 但现在使用了我的注释值。我不明白这里有什么问题。我认为这可能是一个错误。如果我再次遇到它,我只需将我的 docker-compose 文件更改为下一个 wildfly 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2017-06-02
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多