Spring定时任务注解@Scheduled执行计划异常问题

后端系统经常会遇到定时执行某个任务的需求,如果这个任务只是后端的一个方法,没有太过复杂的关联逻辑,那么我们只需要配合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));
    }
}

另外还需要注意一个问题,就是单个定时任务最好保证在指定的执行计划内执行完毕,否则依然会出现该定时任务跳过当次执行的问题。

你可能感兴趣的:(Spring定时任务注解@Scheduled执行计划异常问题)