使用cron计划时,Spring计划正常关闭不起作用

时间:2017-07-28 00:15:40

标签: java spring scheduler quartz

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

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setWaitForTasksToCompleteOnShutdown(true);
    scheduler.setAwaitTerminationSeconds(60);
    return scheduler;
}

我可以优雅地终止调度程序,但前提是我没有任何@Scheduled(cron =)任务。一旦我拥有其中之一,无论调度程序在超时之前会被卡住。我已经尝试使用执行程序配置它并手动执行shutdown / await,效果完全相同。

这些cron作业甚至没有运行。例如,它们将在夜间的固定时间运行。

Spring版本:4.2.8.RELEASE

超时到达结束时会发生这种情况:

2017.07.28 01:44:56 [Thread-3] WARN  Timed out while waiting for executor 'taskScheduler' to terminate

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

那个版本的Spring可能存在错误?请参阅jira.spring.io/browse/SPR-15067

答案 1 :(得分:1)

由于默认情况下,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将仅等待当前正在运行的计划任务完成执行。