Spring 使用计划的 cron 时计划正常关机不起作用
Spring schedule graceful shutdown not working when using a cron scheduled
我有一个小型独立应用程序,可以将调度程序配置为正常终止。使用以下配置:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(60);
return scheduler;
}
我可以让它优雅地终止调度程序,但前提是我没有任何 @Scheduled(cron = ) 任务。一旦我有了其中之一,无论调度程序如何,都会卡住直到超时。我已经尝试过使用执行程序配置它并手动执行 shutdown/await 并且效果完全相同。
这些 cron 作业甚至 运行ning。例如,它们在夜间的固定时间设置为 运行。
Spring版本:4.2.8.RELEASE
这将在超时结束时发生:
2017.07.28 01:44:56 [Thread-3] WARN Timed out while waiting for executor 'taskScheduler' to terminate
有什么想法吗?
该版本的 Spring 可能存在错误?参考jira.spring.io/browse/SPR-15067
因为默认情况下,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只会等待当前运行的计划任务执行完毕。
我有一个小型独立应用程序,可以将调度程序配置为正常终止。使用以下配置:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(60);
return scheduler;
}
我可以让它优雅地终止调度程序,但前提是我没有任何 @Scheduled(cron = ) 任务。一旦我有了其中之一,无论调度程序如何,都会卡住直到超时。我已经尝试过使用执行程序配置它并手动执行 shutdown/await 并且效果完全相同。
这些 cron 作业甚至 运行ning。例如,它们在夜间的固定时间设置为 运行。
Spring版本:4.2.8.RELEASE
这将在超时结束时发生:
2017.07.28 01:44:56 [Thread-3] WARN Timed out while waiting for executor 'taskScheduler' to terminate
有什么想法吗?
该版本的 Spring 可能存在错误?参考jira.spring.io/browse/SPR-15067
因为默认情况下,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只会等待当前运行的计划任务执行完毕。