我有一个小的独立应用程序,可将调度程序配置为正常终止.使用以下配置:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(60);
return scheduler;
}
我可以让它正常终止调度程序,但前提是我没有任何@Scheduled(cron =)任务.一旦有了其中之一,无论什么调度程序都会卡住,直到超时.我已经尝试过使用执行程序配置它,并手动执行shutdown / await,效果完全一样.
这些cron作业甚至没有运行.例如,它们设置为在夜间的固定时间运行.
春季版本:4.2.8.RELEASE
这将在超时结束时发生:
2017.07.28 01:44:56 [Thread-3] WARN Timed out while waiting for executor 'taskScheduler' to terminate
有什么想法吗?
解决方法:
因为默认情况下,ScheduledThreadPoolExecutor将等待所有延迟的计划任务完成执行,即使当时尚未运行计划任务.
请尝试以下操作:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler() {
private static final long serialVersionUID = -1L;
@Override
public void destroy() {
this.getScheduledThreadPoolExecutor().setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
super.destroy();
}
};
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(60);
return scheduler;
}
然后,ScheduledThreadPoolExecutor将仅等待当前正在运行的计划任务完成执行.