java - EJB 计时器忽略 TransactionTimeout

标签 java timer jboss ejb-3.0

我耳边有一个 EJB 计时器,部署在 JBoss 6.4 上。在 99% 的情况下,计时器工作正常,但有时需要太长时间才能完成并抛出 PersistenceException:事务已在不同线程中回滚!

我发现这是由于事务超时值太低造成的。我不想编辑默认值,而是覆盖特定于方法的超时。为了解决这个问题,我将功能分为两种方法:一种是用 @Timeout 注释的方法,另一种是实际完成工作的方法。

这是我的计时器实现:

@Singleton
public class MyTimer implements SomeTimerInterface {

    @EJB
    private SomeManager myManager;

    @Resource
    private TimerService timerService;

    private Timer timer;

    @Override
    public void startTimer() {

        // Timer scheduled to fire every 7th minute
        ScheduleExpression schedule = new ScheduleExpression();
        schedule = schedule.hour("*").minute("*/7").second("00");

        TimerConfig config = new TimerConfig();
        config.setPersistent(false);

        timer = timerService.createCalendarTimer(schedule, config);
    }

    @Timeout
    @AccessTimeout(value = 20, unit = TimeUnit.MINUTES)
    public void handleTimeout() {

        workInNewThread();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    @TransactionTimeout(unit = TimeUnit.SECONDS, value = 900)
    public void workInNewThread() {

        // This can take anything from 1 sec to 15 min.
        List<Object> objects = myManager.getAllTheDatabaseObjects();
    }
}

但是,计时器似乎忽略了 TransactionTimeout,因为它在 5 分钟(默认值)后仍然超时。如何覆盖默认超时以确保计时器完成作业?

最佳答案

不确定我是否理解正确。 从您的代码来看,您似乎是从 @Timeout 方法调用 workInNewThread() ,但有一个带有 Tx 属性的方法 cleanup() 。

我猜您是从 @Timeout 调用同一个 bean 中的方法。 但在这种情况下,注释(@TxAttribute 和 TxTimeout)都不会生效,因为容器不控制内部方法调用。 您需要使用不同的 EJB 或自引用来让 Controller 完成这项工作。 另一种选择是直接注释超时方法。

关于java - EJB 计时器忽略 TransactionTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38460517/

相关文章:

java - GLSL 顶点着色器未编译

java - 比较两个字符串值并返回其在 java 中的索引

java - 在 JFrame 中创建基本动画

java - 在 JBOSS EAP 6.3 中从 RESTFul 客户端(两者位于同一安全域)调用 RESTFul Web 服务时出现 HTTP 错误 401

java - Apache Camel - 发送 JMS 消息时发出警告

java - 绘制图形节点的坐标算法

windows - 需要产生稳定的 10mSec 中断

java - Apache Camel 调度程序错误 : Failed to resolve endpoint

java - 执行我的 drools 规则后如何返回多个 Assets ?

java - 在jboss中运行run.bat时出现"tools.jar unexpected"错误