参考链接:
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-06.html
CronTrigger
比SimpleTrigger
更加有用,通过CronTrigger
可以指定firing-schedules
, 比如”每个周五的中午”、”每个工作日的上午9:30”、”一月的每周一、周三和周五上午9:00至10:00的每个5分钟”。
和SimpleTrigger
一样,CronTrigger
可以通过startTime
指定什么时间schedule开始调度执行,可选的endTime
指定schedule什么时候应该停止。
Cron Expressions
Cron-Expressions 是用来配置CronTrigger
实例的,Cron-Expressions
是由7个子表达式组成的字符串,子表达式由空格分开,分别是:
- 秒(Seconds)
- 分(Minutes)
- 小时(Hours)
- 日(Day-of-Month)
- 月(Month)
- 周几(Day-of-Week)
- 年(Year, 可选字段)
比如0 0 12 ? * WED
, 表示每周三的下午12点。 周几
字段还可以是MON-FRI
、MON,WED,FRI
,或者MON-WED,SAT
。 这里的*
可以表示成每个月,如果*
在周几
字段上可以表示成每周的每一天。
字段名 | 允许的值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 0-11 or JAN-DEC | , - * / |
周几 | 1-7(1=Sunday) or SUN-SAT | , - * ? / L C # |
年 | empty, 1970-2099 | , - * / |
“?”字符:表示没有特定的值,在”日”字段和”周几”字段中使用,在这两个字段中只能在其中一个字段上使用。
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:用在指定一个值的增加幅度。n/m表示从n开始,每次增加m。
比如在分的字段使用 “0/15”, 表示一个小时的每一个15分钟,从0分开始。继续在分字段使用使用”3/20”, 表示一个小时的每20分钟,从第3分开始(和使用”3,23,43”一样)。如果是”/35”就不是表示每35分钟了,表示从0开始,一小时的第35分钟,和指定”0,35”一样。“L”字符:用在”日”字段和”周几”字段里,”日”字段表示一个月中的最后一天(比如1月的31号),用在”周几”字段表示该周最后一天周六(7或者SAT)。如果是”L”前有具体的内容, 那就具有其他的含义了,比如在”周几”字段中的”6L”或者”FRIL”都表示本月的最后一个星期五。还可以为L设置偏移值,如在”日”字段使用”L-3”,若现在是9月份,这里就表示9月的28号,提前了3天。注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题。
“W”字符:指定离 给定日期 最近的工作日(周一到周五),比如在”日”字段指定”15W”, 表示 离本月15号最近的工作日。
“#”字符:用在”周几”字段,表示该月第几个周X,6#3表示该月第3个周五。
“*”:代表所有可能值
Example Cron Expressions
0 0/5 * * * ?
: 每隔5分钟执行一次
0 5/15 0-23 * * *
: 从5分开始,每15分钟执行一次,到了最后一次执行时间正好是23:50
10 0/5 * * * ?
: 每5分钟执行一次,比如10:00:10 am, 10:05:10 am
0 30 10-13 ? * WED,FRI
: 在周三和周五的10:30, 11:30, 12:30和13:30执行
0 0/30 8-9 5,20 * ?
: 每个月的5号和20号的上午8点到9点每半小时执行一次
对于一些特殊的需求,比如上午的9点到10点每5分钟执行一次,然后下午的1点和10点每20分钟执行一次,这种情况下可以创建两个triggers,将这两个triggers注册到schedule中,去运行同一个job。
Building CronTriggers
CronTrigger
实例可以通过TriggerBuilder
(多数主要的属性都有)和CronScheduleBuilder
(指定CronTrigger的属性)。可以导入其的静态方法:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
创建一个每天上午8点到下午17点每两分钟触发一次的trigger(17点以后、18点以前也会执行)
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
.forJob("myJob", "group1")
.build();
创建一个每天上午10:42执行的trigger
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(dailyAtHourAndMinute(10, 42))
.forJob(myJobKey)
.build();
或:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 42 10 * * ?"))
.forJob(myJobKey)
.build();
创建一个在 周三上午10:42执行的trigger,使用系统默认的时区
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
.forJob(myJobKey)
.inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
.build();
或者:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 42 10 ? * WED"))
.inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
.forJob(myJobKey)
.build();
CronTrigger Misfire Instructions
下面的instructions可以用来通知quartz当misfire出现的时候应该做些什么,主要是针对CronTrigger
的。下面的这些定义在CronTrigger
中的instructions常量:
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW
所有的trigger都默认有了Trigger.MISFIRE_INSTRUCTION_SMART_POLICY
instruction,
CronTrigger 将smart policy
执行为MISFIRE_INSTRUCTION_FIRE_NOW
,JavaDoc 对CronTrigger.updateAfterMisfire()
的行为有详尽的解释。
创建CronTrigger,指定misfire instruction:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?")
..withMisfireHandlingInstructionFireAndProceed())
.forJob("myJob", "group1")
.build();