Spring Boot使用@Scheduled时需要注意的坑

因为Scheduled默认时单线程执行的。所以会有一些问题:

1.同一Scheduled任务,上次没有结束时,下次不会执行,时间会顺延。比如,你想1分中执行一次,但是实际业务完成需要3分钟,那么下次任务,会在本次执行结束3分钟之后再开始。

如果想在本次任务结束之前,就直接执行下次任务,那么需要在具体方法上增加@Async

@Async
@Scheduled(cron = "0 */1 * * * ?") 
public void task1()

2.不同的Scheduled任务之间,默认也是同步执行的。

比如:

@Scheduled(cron = "0 */1 * * * ?") 
public void task1()
 
@Scheduled(cron = "0 */1 * * * ?") 
public void task2()

 项目启动后,task1和task2,不会在同一时刻并发执行,而是先执行一个任务,完了之后,再执行另一个。

 解决办法:配置初始化线程池为多个:

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50));
    }
}
posted @ 2021-09-17 10:59  jiafeng  阅读(976)  评论(0编辑  收藏  举报