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;
    }
}

创建一个线程池,这样调度任务就会使用不同的线程去执行,相互影响就降低了

posted @ 2021-01-29 15:41  七星6609  阅读(1379)  评论(1编辑  收藏  举报