一、核心区别对比表
对比项 | Unix Crontab | Quartz | Spring @Scheduled |
---|---|---|---|
表达式位数 | 5 位 | 6 位或 7 位 | 6 位 |
秒级支持 | ❌ 不支持(最小单位是分钟) | ✅ 支持 | ✅ 支持 |
年字段 | ❌ 无 | ✅ 可选第7位 | ❌ 不支持 |
特殊符号支持 | 较少(如 * , , , - , / ) |
很丰富 | 和 Quartz 类似 |
使用环境 | Linux 系统层 | Java Job 框架 | Spring 应用内部调度 |
典型用法 | 系统定时任务 | 分布式定时任务调度 | Java/Spring Bean 定时执行 |
二、表达式格式对比
1. Unix Crontab(5 位)
cpp
* * * * * <command>
| | | | |
| | | | +----- 星期 (0-7)(0和7都代表周日)
| | | +------- 月份 (1 - 12)
| | +--------- 一个月中的第几天 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
❗ 不支持秒,表达式长度固定为 5 位。
✅ 2. Quartz(6~7 位)
cpp
秒 分 时 日 月 星期 [年]
示例:
cpp
0 0 12 * * ? // 每天中午 12 点执行
0/5 * * * * ? // 每 5 秒执行一次
0 0 0 1 1 ? 2025 // 2025年1月1日零点执行一次
?
代表"无特定值",通常在日
和星期
中配合使用。
✅ 3. Spring @Scheduled(6 位,基于 Quartz,但不支持年份)
java
@Scheduled(cron = "0 0 12 * * ?") // 每天中午 12 点
public void task() {
// your code
}
注意:
-
Spring 的
@Scheduled(cron = "...")
默认是 Quartz 格式的 6 位表达式(秒开始),不包含年。 -
要启用定时任务,需在配置类或主类加上:
@EnableScheduling
🧪 三、语法小差异举例
表达式 | Unix crontab | Quartz/Spring | 说明 |
---|---|---|---|
0 0 * * * |
✅ | ❌ | Unix 表示每小时整点 |
0 0 12 * * ? |
❌ | ✅ | Quartz 表示每天中午12点,Unix 无 ? |
*/5 * * * * |
✅ | ✅ | 每 5 分钟执行一次 |
0/10 * * * * ? |
❌ | ✅ | 每 10 秒执行一次,Quartz only |
🛠 四、总结建议
使用场景 | 建议用法 |
---|---|
Linux 系统级任务 | crontab (简单高效) |
Java 后台任务(复杂计划、集群调度) | Quartz |
Spring 应用内部任务 | @Scheduled (配合 @EnableScheduling ) |