CronTrigger通常比Simple Trigger更有用,如果您需要基于日歷的概念而不是按照SimpleTrigger的精確指定間隔進(jìn)行重新啟動的作業(yè)啟動計(jì)劃。
使用CronTrigger,您可以指定號時(shí)間表,例如“每周五中午”或“每個(gè)工作日和上午9:30”,甚至“每周一至周五上午9:00至10點(diǎn)之間每5分鐘”和1月份的星期五“。
即使如此,和SimpleTrigger一樣,CronTrigger有一個(gè)startTime,它指定何時(shí)生效,以及一個(gè)(可選的)endTime,用于指定何時(shí)停止計(jì)劃。
Cron-Expressions用于配置CronTrigger的實(shí)例。Cron Expressions是由七個(gè)子表達(dá)式組成的字符串,用于描述日程表的各個(gè)細(xì)節(jié)。這些子表達(dá)式用空格分隔,并表示:
一個(gè)完整的Cron-Expressions的例子是字符串“0 0 12?* WED“ - 這意味著”每個(gè)星期三下午12:00“。
單個(gè)子表達(dá)式可以包含范圍和/或列表。例如,可以用“MON-FRI”,“MON,WED,F(xiàn)RI”或甚至“MON-WED,SAT”代替前一個(gè)(例如“WED”)示例中的星期幾字段。
通配符(' '字符)可用于說明該字段的“每個(gè)”可能的值。因此,前一個(gè)例子的“月”字段中的“”字符僅僅是“每個(gè)月”。因此,“星期幾”字段中的“*”顯然意味著“每周的每一天”。
所有字段都有一組可以指定的有效值。這些值應(yīng)該是相當(dāng)明顯的 - 例如秒和分鐘的數(shù)字0到59,數(shù)小時(shí)的值0到23。日期可以是1-31的任何值,但是您需要注意在給定的月份中有多少天!月份可以指定為0到11之間的值,或者使用字符串JAN,F(xiàn)EB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC。星期幾可以指定為1到7(1 =星期日)之間的值,或者使用字符串SUN,MON,TUE,WED,THU,F(xiàn)RI和SAT。
'/'字符可用于指定值的增量。例如,如果在“分鐘”字段中輸入“0/15”,則表示“每隔15分鐘,從零開始”。如果您在“分鐘”字段中使用“3/20”,則意味著“每隔20分鐘,從三分鐘開始” - 換句話說,它與“分鐘”中的“3,23,43”相同領(lǐng)域。請注意“ / 35”的細(xì)微之處并不代表“每35分鐘” - 這意味著“每隔35分鐘,從零開始” - 或者換句話說,與指定“0,35”相同。
'?' 字符是允許的日期和星期幾字段。用于指定“無特定值”。當(dāng)您需要在兩個(gè)字段中的一個(gè)字段中指定某個(gè)字符而不是另一個(gè)字段時(shí),這很有用。請參閱下面的示例(和CronTrigger JavaDoc)以進(jìn)行說明。
“L”字符允許用于月日和星期幾字段。這個(gè)角色對于“最后”來說是短暫的,但是在這兩個(gè)領(lǐng)域的每一個(gè)領(lǐng)域都有不同的含義。例如,“月”字段中的“L”表示“月的最后一天” - 1月31日,非閏年2月28日。如果在本周的某一天使用,它只是意味著“7”或“SAT”。但是如果在星期幾的領(lǐng)域中再次使用這個(gè)值,就意味著“最后一個(gè)月的xxx日”,例如“6L”或“FRIL”都意味著“月的最后一個(gè)星期五”。您還可以指定從該月最后一天的偏移量,例如“L-3”,這意味著日歷月份的第三個(gè)到最后一天。當(dāng)使用'L'選項(xiàng)時(shí),重要的是不要指定列表或值的范圍,因?yàn)槟鷷玫交靵y/意外的結(jié)果。
“W”用于指定最近給定日期的工作日(星期一至星期五)。例如,如果要將“15W”指定為月日期字段的值,則意思是:“最近的平日到當(dāng)月15日”。
'#'用于指定本月的“第n個(gè)”XXX工作日。例如,“星期幾”字段中的“6#3”或“FRI#3”的值表示“本月的第三個(gè)星期五”。
以下是一些表達(dá)式及其含義的更多示例 - 您可以在JavaDoc中找到更多的org.quartz.CronExpression
CronTrigger示例1 - 創(chuàng)建一個(gè)觸發(fā)器的表達(dá)式,每5分鐘就會觸發(fā)一次
“0 0/5 * * *?”
CronTrigger示例2 - 創(chuàng)建觸發(fā)器的表達(dá)式,每5分鐘觸發(fā)一次,分鐘后10秒(即上午10時(shí)10分,上午10:05:10等)。
“10 0/5 * * *?”
CronTrigger示例3 - 在每個(gè)星期三和星期五的10:30,11:30,12:30和13:30創(chuàng)建觸發(fā)器的表達(dá)式。
“0 30 10-13?* WED,F(xiàn)RI“
CronTrigger示例4 - 創(chuàng)建觸發(fā)器的表達(dá)式,每個(gè)月5日和20日上午8點(diǎn)至10點(diǎn)之間每半小時(shí)觸發(fā)一次。請注意,觸發(fā)器將不會在上午10點(diǎn)開始,僅在8:00,8:30,9:00和9:30
“0 0/30 8-9 5,20 *?”
請注意,一些調(diào)度要求太復(fù)雜,無法用單一觸發(fā)表示 - 例如“每上午9:00至10:00之間每5分鐘,下午1:00至晚上10點(diǎn)之間每20分鐘”一次。在這種情況下的解決方案是簡單地創(chuàng)建兩個(gè)觸發(fā)器,并注冊它們來運(yùn)行相同的作業(yè)。
CronTrigger實(shí)例使用TriggerBuilder(用于觸發(fā)器的主要屬性)和CronScheduleBuilder(對于CronTrigger特定的屬性)構(gòu)建。要以DSL風(fēng)格使用這些構(gòu)建器,請使用靜態(tài)導(dǎo)入:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
建立一個(gè)觸發(fā)器,每隔兩分鐘,每天上午8點(diǎn)至下午5點(diǎn)之間:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
.forJob("myJob", "group1")
.build();
建立一個(gè)觸發(fā)器,將在上午10:42每天發(fā)射:
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();
建立一個(gè)觸發(fā)器,將在星期三上午10:42在TimeZone(系統(tǒng)默認(rèn)值)之外觸發(fā):
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();
以下說明可以用于通知Quartz當(dāng)CronTrigger發(fā)生失火時(shí)應(yīng)該做什么。(本教程“更多關(guān)于觸發(fā)器”部分引入了失火情況)。這些指令定義為CronTrigger本身的常量(包括描述其行為的JavaDoc)。說明包括:
CronTrigger的Misfire指令常數(shù)
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW
所有觸發(fā)器還具有可用的Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令,并且該指令也是所有觸發(fā)器類型的默認(rèn)值?!爸悄懿呗浴敝噶钣蒀ronTrigger解釋為MISFIRE_INSTRUCTION_FIRE_NOW。CronTrigger.updateAfterMisfire()方法的JavaDoc解釋了此行為的確切細(xì)節(jié)。
在構(gòu)建CronTriggers時(shí),您可以將misfire指令指定為簡單計(jì)劃的一部分(通過CronSchedulerBuilder):
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?")
.withMisfireHandlingInstructionFireAndProceed())
.forJob("myJob", "group1")
.build();
更多建議: