我在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秒的时间段。有时后续呼叫之间的频率更高(每秒几次)。可能是什么原因?我在这里错过了什么吗?提前感谢您的回答。
答案 0 :(得分:1)
方法queryOrderStatusesBatch
中的逻辑是多么耗时?我认为这种方法的invocaiton之间15-30个沉默期的原因可以是有限的线程数。定时服务使用线程池来运行计划任务。如果@Schedule
注释方法中的逻辑很耗时并且经常执行,那么下一次调用可能不会发生,因为没有自由线程来运行任务。
可以配置定时器服务线程池,例如通过应用程序服务器中的管理控制台。
关于后续调用之间的较高频率 - 原因可以回滚与@Schedule
注释方法相关联的事务。在示例中,您提供了方法queryOrderStatusesBatch
的事务类型为REQUIRED
。如果您在那里实现的逻辑抛出异常,则会自动回滚事务。此外,容器有义务重试超时方法。