Spring Boot开启定时任务

一、启用定时任务功能

在 Spring Boot 主类或配置类上添加 @EnableScheduling​ 注解:

@SpringBootApplication
@EnableScheduling // 启用定时任务
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

二、创建定时任务方法

在任意 Spring Bean 中定义方法,并使用 @Scheduled​ 注解配置执行时间:

@Component
public class MyScheduler {

    // 每隔 5 秒执行一次(固定频率)
    @Scheduled(fixedRate = 5000)
    public void task1() {
        System.out.println("Fixed Rate Task: " + new Date());
    }

    // 上一次任务结束后,间隔 3 秒再执行(固定延迟)
    @Scheduled(fixedDelay = 3000)
    public void task2() {
        System.out.println("Fixed Delay Task: " + new Date());
    }

    // 使用 Cron 表达式(每天 8 点执行)
    @Scheduled(cron = "0 0 8 * * ?")
    public void task3() {
        System.out.println("Cron Task: " + new Date());
    }
}

三、@Scheduled​ 参数详解

  • fixedRate​: 固定频率执行(单位:毫秒),无论上一次任务是否完成。
  • fixedDelay​: 上一次任务完成后,间隔指定时间再执行(单位:毫秒)。
  • cron​: 使用 Cron 表达式定义复杂时间规则(如 0 0/5 * * * ?​ 每 5 分钟执行一次)。

四、Cron 表达式格式

Spring Boot 中的 Cron 表达式为 6 个字段(传统 Unix Cron 是 5 个字段):

秒(0-59) 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7,0 和 7 均为周日)

示例:

  • 0 0 10 * * *​:每天 10:00 执行
  • 0 0/30 9-17 * * MON-FRI​:工作日 9:00 到 17:00,每 30 分钟执行一次
  • 0 15 10 L * ?​:每月最后一天的 10:15 执行

五、自定义线程池(可选)

默认情况下,所有定时任务共享单一线程。如需并发执行,可配置自定义线程池:

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

常见问题排查

  • 任务未执行:确保类被 Spring 扫描(添加 @Component​ 等注解)。
  • Cron 表达式错误:使用在线工具(如 Cron Maker)验证。
  • 任务阻塞:长时间任务可能影响其他任务,考虑异步执行(结合 @Async​)。