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