使用@Scheduled 注解,我们一般会为其配置上一个线程池,我在写一个简单demo的时候,发现配上线程池后,关闭程序时,会打印出如下日志,
2021-07-12 23:50:10.381 [tid: ][skId: ] [SpringContextShutdownHook] INFO o.s.s.c.ThreadPoolTaskScheduler:218 - Shutting down ExecutorService ‘taskScheduler’
2021-07-12 23:50:12.387 [tid: ][skId: ] [SpringContextShutdownHook] WARN o.s.s.c.ThreadPoolTaskScheduler:256 - Timed out while waiting for executor ‘taskScheduler’ to terminate
2021-07-12 23:50:12.387 [tid: ][skId: ] [SpringContextShutdownHook] INFO o.s.s.c.ThreadPoolTaskScheduler:218 - Shutting down ExecutorService ‘taskScheduler’
2021-07-12 23:50:14.391 [tid: ][skId: ] [SpringContextShutdownHook] WARN o.s.s.c.ThreadPoolTaskScheduler:256 - Timed out while waiting for executor ‘taskScheduler’ to terminate
2021-07-12 23:50:14.405 [tid: ][skId: ] [SpringContextShutdownHook] INFO c.z.hikari.HikariDataSource:350 - village_test-POOL - Shutdown initiated…
2021-07-12 23:50:14.419 [tid: ][skId: ] [SpringContextShutdownHook] INFO c.z.hikari.HikariDataSource:352 - village_test-POOL - Shutdown completed.
我的线程池配置如下
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(2);
executor.setThreadNamePrefix("selfSchedule@");
executor.setAwaitTerminationSeconds(2);
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
我要执行的任务,其实只是一个很简单的遍历任务,循环一次耗时远小于1s,我给的等待时间有2s,为什么还是会报超时问题呢?
查询了下Stack Overflow ,记录下原因。
Because by default the ScheduledThreadPoolExecutor will wait for all delayed scheduled tasks to finish executing, even if scheduled tasks aren’t running at that time.
即使任务并不在执行中,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;
}
原文地址,我搜索了一圈没找到答案,特此记录下。
解决Spring ThreadPoolTaskScheduler超时问题:关闭程序时任务延迟执行

在使用Spring @Scheduled注解时,配置线程池后,程序关闭时遇到超时问题。文章探讨了ScheduledThreadPoolExecutor等待任务结束的原因,并提供了修改ThreadPoolTaskScheduler以避免超时的方法,包括设置executeExistingDelayedTasksAfterShutdownPolicy为false。
770

被折叠的 条评论
为什么被折叠?



