Quartz Cron 格式
Quartz 表达式有六或七个字段:秒、分钟、小时、日、月、星期以及可选的年。例如 0 0 12 ? * MON-FRI 表示工作日中午 12 点触发。星期编号为 1(星期日)到 7(星期六),也可以使用 MON、FRI 等英文缩写,范围中同样适用。
问号规则
Quartz 不允许同时限定“日”和“星期”。这两个字段中必须恰好有一个为“?”,表示“不指定值”。因此 0 0 12 * * MON 是无效的,应写成 0 0 12 ? * MON。解析器会立即指出这类错误。
特殊字符 L、W 和 #
L 表示“最后”:在“日”字段中 L 是当月最后一天,L-3 是最后一天的前三天;在“星期”字段中 6L 表示当月最后一个星期五。W 表示离指定日期最近的工作日且不会跨月,因此 15W 会在离 15 日最近的工作日触发,LW 表示当月最后一个工作日。井号用于选择第 n 个星期几:6#3 表示第三个星期五。
Quartz 实战
在 Java 代码中,Quartz 表达式挂在触发器上,例如 TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 ? * MON-FRI").inTimeZone(TimeZone.getTimeZone("Asia/Shanghai")))。不调用 inTimeZone 时使用 JVM 的默认时区。错过触发(misfire)策略决定调度器在计划时间宕机时的行为:立即补触发一次,或直接跳到下一个时间点。
常见问题
- Quartz Cron 和 Unix Cron 有什么区别?
- Quartz 在开头增加了秒字段、末尾可选年字段,星期从 1 = 星期日开始编号,要求“日”或“星期”之一为“?”,并支持 L、W 和 #。
- 能把 Quartz 表达式转换成 crontab 吗?
- 可以,只要秒为 0、没有设置年,且没有使用 L、W 或 #。转换器会给出等价的 crontab 表达式,或说明无法转换的原因。
- 0 0/5 * * * ? 是什么意思?
- 表示每 5 分钟触发一次:每天每小时从第 0 分钟开始,在第 0 秒触发。
- Spring 的 @Scheduled cron 和 Quartz 一样吗?
- 非常相似,但 Spring 用 0 或 7 表示星期日、没有年字段,也不强制使用“?”。Spring 表达式请使用 Spring 页面。