最近在测试服务器上发现定时任务执行的时候很奇怪,我定时1个小时执行一次,有时候执行,有时候不执行,有时候间隔几个小时执行一次。
这是什么情况,明明在我本地测试的时候没有这些乱七八糟的问题啊!!!
在测试服务器查找一番才发现,测试服务器数据较多,运行的项目也比较多,我部署的项目里面有多个定时任务,每个定时任务执行的时间都不同。
SpringBoot 默认的定时任务是单线程的,就是说如果当前时间有一个定时任务在执行,那么下一个定时任务就要等待,等待上一个定时任务执行完成才会执行下一个定时任务。
如果定时任务排队时间过长,就有可能导致当前的定时任务和下次定时任务重叠,就有可能2次定时任务只执行一次,甚至有的时候就不执行了。
最终解决办法是用线程池。
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
public class ScheduledTaskConfiguration implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}
在项目里面增加线程池的配置,理论上应该线程池就生效了。
其他可能的情况,以及测试情况请参考以下地址。
https://blog.51cto.com/u_14572091/5959161
我没有进行测试,我用了博主的方法,目前看我的问题是解决了。
下一步是把每个定时任务的执行时间记录下来,看看哪个定时任务执行的时间比较长~!