SpringBoot cron 表达式
·
在 Spring Boot 中,cron 表达式主要用于 @Scheduled 定时任务和 Quartz 调度框架。
它由 6 或 7 个字段组成(秒 分 时 日 月 周 [年])。
一、基本语法格式
秒 分 时 日 月 周 [年(可选)]
| 字段 | 允许值 | 允许特殊字符 |
|---|---|---|
| 秒 | 0-59 | , - * / |
| 分 | 0-59 | , - * / |
| 时 | 0-23 | , - * / |
| 日 | 1-31 | , - * ? / L W |
| 月 | 1-12 或 JAN-DEC | , - * / |
| 周 | 1-7 或 SUN-SAT(1=SUN) | , - * ? / L # |
| 年(可选) | 1970-2099 | , - * / |
二、特殊字符含义
| 字符 | 含义 |
|---|---|
* |
所有值,如秒为 * 表示每秒 |
? |
不指定值,仅用于“日”和“周”字段,互斥时使用 |
- |
范围,如 10-12 表示 10 到 12 |
, |
枚举,如 1,3,5 |
/ |
增量,如 0/15 表示从 0 开始每 15 单位 |
L |
最后(Last),如 L 在“日”表示月末最后一天 |
W |
工作日(Weekday),如 15W 表示离 15 号最近的工作日 |
# |
第几个星期几,如 2#3 表示第 3 个周二(周=2,月第3个) |
三、常用示例
0 0 0 * * ? # 每天 00:00:00 0 0 12 * * ? # 每天 12:00:00 0 15 10 * * ? # 每天 10:15:00 0 0/5 14 * * ? # 每天 14:00 到 14:55 每5分钟 0 0/5 14,18 * * ? # 每天 14:00-14:55 和 18:00-18:55 每5分钟 0 0 12 ? * WED # 每周三 12:00:00 0 0 12 * * ? # 每天中午 0 15 10 15 * ? # 每月 15 日 10:15:00 0 0 12 1 * ? # 每月 1 日 12:00:00 0 0 12 L * ? # 每月最后一天 12:00:00 0 0 10 ? * 1#3 # 每月第 3 个周日(周=1,第3个) 0 0 12 ? * 2#1 # 每月第 1 个周一
四、Spring Boot 中的使用方式
1. 开启定时任务
在主类或配置类上加 @EnableScheduling:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. 使用 @Scheduled 注解
@Component
public class MyTask {
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
public void doTask() {
System.out.println("定时任务执行: " + new Date());
}
}
3. 从配置文件读取 cron(推荐)
@Scheduled(cron = "${my.task.cron}")
public void doTask() {
// ...
}
application.yml 中配置:
my:
task:
cron: 0 0 3 * * ?
五、注意事项
| 注意点 | 说明 |
|---|---|
| 日与周互斥 | 两者必须有一个为 ?,不能同时指定具体值 |
| 默认时区 | 使用系统默认时区,可通过 zone 属性指定:@Scheduled(cron = "...", zone = "Asia/Shanghai") |
| 执行时间 | 方法执行完才会开始下一次,若担心堆积,可配合 @Async |
| 不依赖年 | 多数情况省略“年”,即 6 位表达式 |
| Cron 表达式在线生成 | 推荐使用 cron.qqe2.com 或 freeformatter.com/cron-generator 验证 |
六、排查问题建议
-
未执行:检查是否加了
@EnableScheduling -
时间不对:检查服务器时区,或用
zone指定 -
表达式报错:确保日/周有一个是
?,且字段数量为 6 或 7
更多推荐
所有评论(0)