@Schedule随机执行

时间:2015-01-11 13:18:56

标签: java ejb ejb-3.1 wildfly

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

1 个答案:

答案 0 :(得分:1)

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

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