java@Schedule在随机时刻执行
我在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 楼答案
方法
queryOrderStatusesBatch
中的逻辑有多耗时?我认为这种方法在两次调用之间保持15-30个静默期的原因可能是线程数有限。计时器服务使用线程池来运行计划任务。如果@Schedule
注释的方法中的逻辑非常耗时,并且经常执行,那么下一次调用可能不会发生,因为没有空闲线程来运行任务。 计时器服务线程池可以通过应用服务器中的管理控制台进行配置关于后续调用之间更高的自由度,原因可能是与
@Schedule
注释方法关联的事务回滚。在这个示例中,您给出的方法queryOrderStatusesBatch
的事务类型是REQUIRED
。如果您在那里实现的逻辑抛出异常,则事务将自动回滚。此外,容器必须重试超时方法