【问题标题】:@Schedule executed in random moments@Schedule 在随机时刻执行
【发布时间】:2015-01-11 13:18:55
【问题描述】:

我在 Wildfly 中运行了一些代码:

@Stateless
public class OrderStatusMonitorScheduler {

    @Inject
    private OrderEntityDao orderEntityDao;

    @Inject
    private TradeAgentClientSender tradeAgentClientSender;

    @Schedule(second="*/1", minute="*", hour="*", persistent = false)
    public void queryOrderStatusesBatch() {
        log.debug("queryOrderStatusesBatch start");
        ....
    }
}

有时调度程序每秒执行一次,但有时在将“queryOrderStatusesBatch start”写入日志文件之间有 15-30 秒的时间间隔。有时后续调用之间的频率更高(每秒几次)。可能是什么原因?我在这里错过了什么吗?提前感谢您的回答。

【问题讨论】:

    标签: java ejb ejb-3.1 wildfly


    【解决方案1】:

    queryOrderStatusesBatch 方法内部的逻辑有多耗时?我认为这种方法的调用之间有 15-30 个静默期的原因可能是线程数有限。 Timer Service 使用线程池来运行计划任务。如果@Schedule 注释方法内部的逻辑耗时且经常执行,则可能不会发生下一次调用,因为没有空闲线程来运行任务。 可以配置定时器服务线程池,例如通过应用服务器中的管理控制台。

    关于后续调用之间的更高频率-原因可以回滚与@Schedule注释方法关联的事务。在示例中,您提供的方法queryOrderStatusesBatch 的事务类型是REQUIRED。如果您在那里实现的逻辑引发异常,则事务将自动回滚。而且容器有义务重试超时方法。

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 2021-01-06
      • 2015-08-07
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2016-06-17
      相关资源
      最近更新 更多