springboot中多个定时任务(@Scheduled)如何互不影响
现象
在springboot中,添加 多个 @Scheduled(cron = “0 10 7 * * ?”) 注解,例如:
@Scheduled(cron = “0 10 5 * * ?”)
@Scheduled(cron = “0 10 6 * * ?”)
@Scheduled(cron = “0 10 7 * * ?”)
在执行时发现,如果6点10分的任务到了7点10分,还没完成,那7点10分的任务不会正常开始执行,要等6点10分的任务接收后,7点10分的任务才会开始执行。
在我的程序中,几个定时任务之间没有依赖关系,所以我不想等待6点10分的任务,到了7点10分正常开始执行就行,该怎么做呢
原因
在 Spring Boot 中,默认情况下,@Scheduled 任务使用的是 单线程的 TaskScheduler,这意味着:
- 所有定时任务会串行执行(一个任务执行完,才会执行下一个)。
- 如果某个任务执行时间过长或阻塞,后续任务会被延迟,甚至“堆积”无法执行。
解决方案
配置多线程任务调度
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;@Configuration
public class SchedulerConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(5); // 设置线程池大小(根据任务数量调整)taskScheduler.setThreadNamePrefix("scheduled-task-");taskScheduler.initialize();taskRegistrar.setTaskScheduler(taskScheduler);}
}
效果
- 每个 @Scheduled 任务会分配独立的线程执行,互不阻塞。
- 适用于 任务之间无依赖关系 的场景。