求每日00:30起每4小时执行的Quartz Cron调度表达式
Quartz指定间隔调度场景的Cron表达式写法
适配需求(每日00:30起每4小时执行,触发点为00:30、04:30、08:30、12:30、16:30、20:30)的正确Quartz Cron表达式为:0 30 0/4 * * ?
表达式字段拆解
Quartz Cron表达式固定遵循秒 分 时 日 月 周 [年]的字段顺序(年为可选字段,日常调度一般不需要配置),上述表达式各字段含义:
- 秒位:
0,代表在整秒时刻触发 - 分位:
30,代表取对应小时的第30分钟 - 时位:
0/4,代表从当日0点开始,按4小时步长取有效小时值,自动覆盖0、4、8、12、16、20六个符合要求的时间点 - 日位:
*,代表不限制具体日期 - 月位:
*,代表不限制具体月份 - 周位:
?,Quartz中日、周字段为互斥规则字段,当日维度设置了通配规则时,周字段必须填?避免规则冲突报错
等价写法
如果偏好明确枚举触发小时的高可读写法,也可以使用完全等价的表达式,执行效果没有任何区别:0 30 0,4,8,12,16,20 * * ?
触发时间校验
上述两个表达式每日的触发时间完全匹配需求:
- 00:30(即12:30am)
- 04:30(即4:30am)
- 08:30(即8:30am)
- 12:30(即12:30pm)
- 16:30(即4:30pm)
- 20:30(即8:30pm)
常见配置踩坑说明
- 时位如果用
*/4写法,当前场景下和0/4效果一致(因为小时字段最小值为0),但如果后续调整起始时间很容易出错,写0/4语义更明确,直接体现从0点开始计数的规则。 - 周位不要误填为
*,Quartz中日和周是互斥字段,两个字段同时设全量通配会触发规则校验报错,必须把其中一个设为?表示不指定该维度规则。 - 不要直接套用Linux Crontab的表达式写法,Linux Crontab没有秒位,周字段的计数规则也和Quartz有差异,直接复用会导致触发时间完全错乱。
内容的提问来源于stack exchange,提问作者Sneha Nadar
相关产品推荐
相关产品推荐

