springboot中多个定时任务(@Scheduled)如何互不影响
摘要:Spring Boot中默认使用单线程执行@Scheduled定时任务,导致长时间运行的任务会阻塞后续任务。通过配置ThreadPoolTaskScheduler线程池(设置SchedulingConfigurer),可以让多个定时任务并行执行。关键步骤包括:1)创建ThreadPoolTaskScheduler实例;2)设置线程池大小;3)初始化并注册任务调度器。这样无依赖关系的定时任务就
现象
在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 {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(5); // 设置线程池大小(根据任务数量调整)
taskScheduler.setThreadNamePrefix("scheduled-task-");
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}
效果
- 每个 @Scheduled 任务会分配独立的线程执行,互不阻塞。
- 适用于 任务之间无依赖关系 的场景。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)