【问题标题】:Spring schedule graceful shutdown not working when using a cron scheduled使用计划的 cron 时,Spring 计划正常关闭不起作用
【发布时间】:2023-03-30 22:46:01
【问题描述】:

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

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

我可以让它优雅地终止调度程序,但前提是我没有任何 @Scheduled(cron = ) 任务。一旦我拥有其中之一,无论调度程序会被卡住直到超时。我已经尝试使用执行器对其进行配置,并手动执行关机/等待,效果完全一样。

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

春季版:4.2.8.RELEASE

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

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

有什么想法吗?

【问题讨论】:

  • 没错。不错的收获。也许您可以将其提升为答案,以便我接受。谢谢。

标签: java spring scheduler quartz


【解决方案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 将只等待当前正在运行的计划任务完成执行。

【讨论】:

  • getScheduledThreadPoolExecutor()方法如何实现?
【解决方案2】:

该版本的 Spring 中可能存在错误?参考jira.spring.io/browse/SPR-15067

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多