@Schedule 在随机时刻执行

@Schedule executed in random moments

我在 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 秒的时间间隔。有时后续调用之间的频率更高(每秒几次)。可能是什么原因?我在这里错过了什么吗?预先感谢您的回答。

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

关于后续调用之间的较高频率 - 原因可以回滚与 @Schedule 注释方法相关的事务。在您提供的示例中,方法 queryOrderStatusesBatch 的交易类型是 REQUIRED。如果您在那里实现的逻辑抛出异常,那么事务将自动回滚。此外,容器有义务重试超时方法。