使用cron计划时,Spring计划正常关闭无法正常工作

我有一个小的独立应用程序,可将调度程序配置为正常终止.使用以下配置:

@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将仅等待当前正在运行的计划任务完成执行.

上一篇:SpringBoot quartz定时器


下一篇:SpringBoot2.0整合Quartz自动化配置集成