Spring中使用@Scheduled配合Cron实现定时任务需启用@EnableScheduling、方法须public void无参且在Spring Bean中,Cron格式为秒分时日月周年,支持动态线程池配置与异常处理。

在 Spring 中使用 @Scheduled 注解配合 Cron 表达式,是实现轻量级定时任务的常用方式。关键在于开启定时任务支持、正确配置 Cron 表达式,并确保方法满足调度要求。
启用定时任务功能
Spring Boot 项目需在启动类或配置类上添加 @EnableScheduling 注解,否则 @Scheduled 不会生效:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
编写带 Cron 的定时方法
被调度的方法必须是 public、无参数、返回 void,且定义在 Spring 管理的 Bean 中(如 @Service 或 @Component):
@Service
public class ReportTask {
<pre class="brush:php;toolbar:false;">@Scheduled(cron = "0 0 * * * ?") // 每小时整点执行
public void generateHourlyReport() {
System.out.println("生成小时报表:" + LocalDateTime.now());
}
}
Cron 表达式格式为:秒 分 时 日 月 周 年(可选),常用字段含义如下:
-
秒(0–59):如
0表示每分钟第 0 秒触发 -
分(0–59):如
*/15表示每 15 分钟一次 -
时(0–23):如
9,14表示每天 9 点和 14 点 -
日(1–31):用
*表示每天,?用于日/周互斥占位 -
周(1–7,1=周日):如
MON,WED,FRI或2,4,6 - 年(可选,1970–2099):一般省略
常见 Cron 示例
以下是一些实用写法(注意空格和大小写):
-
"0 0 0 * * ?"— 每天 00:00:00 执行(午夜) -
"0 0 9-18 * * MON-FRI"— 工作日每小时 9–18 点整点执行 -
"0 30 10 * * ?"— 每天 10:30:00 执行 -
"0 0/5 * * * ?"— 每 5 分钟执行一次(从每小时第 0 分钟开始) -
"0 0 12 ? * WED"— 每周三中午 12 点执行
注意事项与进阶建议
实际使用中需注意以下几点:
- Cron 表达式不支持动态修改;如需运行时调整,可结合
ThreadPoolTaskScheduler编程式注册任务 - 默认单线程执行,多个任务会串行;若需并发,配置自定义线程池:
@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.initialize();
registrar.setTaskScheduler(scheduler);
}
}
- 避免在定时方法中抛出未捕获异常,否则后续执行可能中断;建议加 try-catch 或全局异常处理
- 生产环境建议记录日志或埋点,便于监控任务是否准时触发
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











