后端系统经常会遇到定时执行某个任务的需求,如果这个任务只是后端的一个方法,没有太过复杂的关联逻辑,那么我们只需要配合Spring框架提的供定时任务注解@Scheduled再加上一个Cron表达式便可轻轻松松满足需求,没错,实现就是这么简单。
但是功能到生产环境以后发现一个问题,定时任务并没有按照我们预定的执行计划执行,经常会漏执行,很奇怪,这是为神马?
给所有定时任务加日志,发现一个规律,如果程序里面有多个定时任务,则每一个定时任务的日志是串行打印的,并没有想象中的并行打印,也就是这些定时任务同时只有一个线程在执行。google一下资料,果然,Spring默认给所有定时任务只分配了一个线程,这样的话如果我们有很多定时任务或者一个定时任务执行很久,就会造成其他定时任务阻塞中,无法按照cron执行的情况。
解决办法就是程序里面用了多少定时任务注解@Scheduled,就初始化多少线程,这样各个定时任务就不会互相影响了。
代码如下:
@Configuration
//定时任务调用一个线程池中的线程。
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//参数传入一个size为10的线程池
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
另外还需要注意一个问题,就是单个定时任务最好保证在指定的执行计划内执行完毕,否则依然会出现该定时任务跳过当次执行的问题。
网友评论