使用@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;
}
原文地址,我搜索了一圈没找到答案,特此记录下。