一次旧项目中,我使用下面的表达式时启动报错,去掉最后一段后恢复:

0 0 2 1 * ? *
0 0 2 1 * ?

这不意味着七段 cron 普遍错误,而是提示需要先确认谁在解析它。

Spring 与 Quartz 的字段不同

Spring 5.0 的 CronSequenceGenerator 使用六个字段,依次是秒、分、时、月内日期、月、星期。在这种规则下:

0 0 2 1 * ?

表达的是按调度器时区,在每月 1 日凌晨 2 点触发。问号在该实现的日期或星期字段中用于不指定该项。Spring 5.0 CronSequenceGenerator

Quartz 2.3 的 CronTrigger 则支持六或七个字段,第七个年字段可选,因此带最后一个 * 的表达式在相应语法下可以成立。Quartz 2.3 CronTrigger 教程

系统 crontab 又常见五个时间字段,不能直接把 Java 框架的表达式复制过去。字段数量相同,也不保证特殊字符规则完全相同。

出错时先找解析器,不要先删字段

检查注解或配置由哪个组件消费,再查看依赖版本、解析器类和完整异常。启动失败也可能来自配置绑定或其他初始化过程,不能只因为修改表达式后恢复,就跳过错误日志。

最后按实际实现计算后续几次触发时间,核对月界、时区、夏令时和任务错过执行时的处理。cron 文本只描述时间匹配,不自动说明任务是否并发、是否补跑或失败重试。

当年的记录没有保存精确框架版本,所以能确认的是删去字段后的观察,不能反推项目一定使用哪种实现。实际使用时,以项目自己的调度器文档和解析结果为准。