Spring Boot 配置定时任务需两步:一、启动类加@EnableScheduling开启总开关;二、在@Component类中用@Scheduled定义void无参方法,支持cron/fixedRate/fixedDelay任选其一;默认单线程,可通过SchedulingConfigurer配线程池实现并发,动态修改需自定义TriggerTask。

Spring Boot 配置定时任务,核心就两步:开启调度开关 + 定义执行逻辑。不需要额外引入依赖,Spring Boot 内置的 @Scheduled 就能直接用。
一、必须开启定时任务总开关
在启动类上加 @EnableScheduling 注解,否则所有定时方法都不会触发:
@SpringBootApplication
@EnableScheduling // 关键!缺了这行,定时任务不生效
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}二、写一个带 @Scheduled 的任务方法
新建一个 @Component 类,在方法上标注 @Scheduled,注意三点:
- 方法必须是 void 类型、无参数
- 类要被 Spring 管理(加
@Component或@Service) - 只能选一种触发方式:cron / fixedRate / fixedDelay(不能混用)
常用写法示例:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
cron 表达式(适合精确到秒/分/时的规则):
@Scheduled(cron = "0 0 2 * * ?")→ 每天凌晨 2 点执行 -
fixedRate(从上次开始时间起算,每 N 毫秒执行):
@Scheduled(fixedRate = 10000)→ 每 10 秒执行一次(不管上次是否结束) -
fixedDelay(等上次执行完,再延迟 N 毫秒):
@Scheduled(fixedDelay = 5000)→ 上次执行完后,隔 5 秒再执行 -
首次延迟执行(配合 fixedRate 或 fixedDelay 使用):
@Scheduled(fixedRate = 5000, initialDelay = 2000)→ 启动后先等 2 秒,再开始每 5 秒执行
三、避免任务互相阻塞:配个线程池
默认是单线程串行执行。如果一个任务卡住或耗时长,其他任务就得排队。解决办法是配置多线程调度器:
- 新建配置类,实现
SchedulingConfigurer - 用
Executors.newScheduledThreadPool(5)创建线程池 - 调用
taskRegistrar.setScheduler(...)替换默认调度器
这样多个 @Scheduled 方法就能并发执行,互不影响。
四、动态修改执行时间?走 SchedulingConfigurer 路线
如果需要运行时改 cron 表达式(比如从数据库读取、后台页面调整),就不能只靠 @Scheduled 注解了。得自己实现 SchedulingConfigurer 接口,用 addTriggerTask 动态注册任务,并在每次触发前重新查数据库获取最新表达式。这种方式支持启停、重载,适合中后台可配置场景。

















