大概内容
解析Cron表达式
Cron表达式的语法规则
相关的类
实现原理
cron表达式的语法
Quartz的Cron表达式有6个必要的字段和1个可选的字段组成,各个字段以空格分隔。
字段名
允许的值
允许的特殊字符
Seconds
0-59
, - * /
Minutes
0-59
, - * /
Hours
0-23
, - * /
Day-of-month
1-31
, - * / ? L W
Month
0-11 or JAN-DEC
, - * /
Day-of-Week
1-7 or SUN-SAT
, - * / ? L #
Year (Optional)
empty, 1970-2199
, - * /
* : 用来表示任意值
? : 只能用在“Day-of-month”和“Day-of-Week”这两个字段,表示没有特定的值
- : 用来表示范围,例如在Hours字段配置“10-12”,解析过来就是小时数为10,11和12都满足。
, : 用来表示枚举值,例如在Day-of-Week字段配置“MON,WED,FRI”,解析过来就是星期一,星期三和星期五都满足。
/ : 用来表示增量逻辑,格式为“初始值/增量值”,例如在Seconds字段配置“5/15”,解析过来就是5,20,35,50都符合。
L : last的简写,只能用在“Day-of-month”和“Day-of-Week”这两个字段,
W : weekday的简写,只能用在“Day-of-month”字段,表示最靠近指定日期的工作日(星期一到星期五)
# : 只能用在Day-of-Week字段,“m#n”表示这个月的第n个星期m。
相关的类
CronExpression.java
CronScheduleBuilder.java
CronTriggerImpl.java
实现原理
转换为TreeSet对象
Cron表达式有7个字段,CronExpression把这7个字段解析为7个TreeSet的对象。
填充TreeSet对象值的时候,表达式都会转换为起始值、结束值和增量的计算模式,然后计算出匹配的值放进TreeSet对象。
举个例子,假如Cron表达式配置为:0/15 5-10 9,18 1,15 * ? 2018-2023
解析后在各个TreeSet对象的内容如下
// [0, 15, 30, 45]
protected transient TreeSet seconds;
// [5, 6, 7, 8, 9, 10]
protected tr