现象

在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 任务会分配独立的线程执行,互不阻塞。
  • 适用于 任务之间无依赖关系 的场景。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐