背景
今天debug项目时发现所有定时任务在程序启动时执行几次后就不执行了
检查代码也没发现有什么问题 通过jstack查看线程信息时 发现只有一个名字为scheduling-1的线程 而且还是time-waiting状态的 分析调用链发现是手动调用了Thread.sleap方法导致
原因: 项目中有多个定时任务要运行 而只有一个核心线程 还是阻塞的 所以其他定时任务得不到执行
分析方案
jstack 25097|grep scheduling -A 10
查看结果请点击附录1
解决方案
为定时任务配置线程池 让它支持多线程
asyncTaskExecutor 针对@Async方法
taskScheduler 针对@Scheduled方法
public class TaskConfig {
public TaskConfig() {
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnAnnotation(EnableAsync.class)
public AsyncTaskExecutor asyncTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(12);
executor.setQueueCapacity(20);
executor.setMaxPoolSize(50);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix