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