@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
。如果您在那里实现的逻辑抛出异常,那么事务将自动回滚。此外,容器有义务重试超时方法。
我在 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
。如果您在那里实现的逻辑抛出异常,那么事务将自动回滚。此外,容器有义务重试超时方法。