spring中使用@schedule进行任务调度时遇到的坑
spring是在开发中使用比较广泛的开发套件,开箱即用,很是方便,比如在开发定时任务时,只需要使用@Schedule就可以轻松配置,简直不要很方便,但是如果开发了很多定时任务,而且有的定时任务执行时间比较长,如果没有设置线程池,可能会出现定时任务执行时间和实际指定的时间不一致的问题,下面是我们遇到的问题
1.问题现象
开发了20多个定时任务,在测试环境执行都是正常,偏偏到了生产环境出现执行时间和实际指定时间不在同一节奏,导致执行错乱
2.分析原因
看了日志,所有定时任务日志都是同一个线程
顿时发现问题所在,spring定时任务默认使用的是单线程调度的,所有很多定时任务排队执行,时间就错乱了,如果有任务卡死,那其他任务就别想执行了
3.解决方式
@Configuration @EnableAsync public class ScheduleConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); //计划任务线程池,每来一个任务创一个线程,直至线程池满 taskScheduler.setPoolSize(10); return taskScheduler; } }
创建一个线程池,这样调度任务就会使用不同的线程去执行,相互影响就降低了
百流积聚,江河是也;文若化风,可以砾石。