Quartz學習筆記(四)SimpleTrigger,CronTrigger
- SimpleTrigger
- SimpleTrigger相關屬性設置API
- SimpleTrigger的Misfire策略
- MISFIRE_INSTRUCTION_FIRE_NOW
- MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_CO
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
- MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
- MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
- 默認策略
- CronTrigger
SimpleTrigger
SimpleTrigger主要可以滿足一些簡單的調度需求,比如在某個時間點執行一次,或者在某個時間點開始執行,然後以某一個時間間隔來重複執行。SimpleTrigger的屬性包括:開始時間、結束時間、重複次數以及重複的間隔。其中關於結束時間需要有特殊注意的地方
SimpleTrigger相關屬性設置API
方法 | 設置類 | 描述 | 備註 |
---|---|---|---|
startAt(Date triggerStartTime) | TriggerBuilder | 設置任務開始時間 | 用DateBuilder可以輕鬆獲取參數Date |
startNow() | TriggerBuilder | 設置任務開始爲當前時間 | |
endAt(Date triggerEndTime) | TriggerBuilder | 設置任務介紹時間 | 用DateBuilder可以輕鬆獲取參數Date |
withIntervalInMilliseconds(long intervalInMillis) | SimpleScheduleBuilder | 設置任務執行間隔,單位:毫秒 | |
withIntervalInSeconds(int intervalInSeconds) | SimpleScheduleBuilder | 設置任務執行間隔,單位:秒 | |
withIntervalInMinutes(int intervalInMinutes) | SimpleScheduleBuilder | 設置任務執行間隔,單位:分 | |
withIntervalInHours(int intervalInHours) | SimpleScheduleBuilder | 設置任務執行間隔,單位:小時 | |
withRepeatCount(int triggerRepeatCount) | SimpleScheduleBuilder | 設置任務重複次數 | |
repeatForever() | SimpleScheduleBuilder | 無限期重複 | |
repeatSecondlyForever(int seconds) | SimpleScheduleBuilder | 設置以多少秒的間隔永遠重複 | 重載的方法沒有參數,默認1秒 |
repeatMinutelyForever(int minutes) | SimpleScheduleBuilder | 設置以多少分的間隔永遠重複 | 重載的方法沒有參數,默認1分 |
repeatHourlyForever(int hours) | SimpleScheduleBuilder | 設置以多少小時的間隔永遠重複 | 重載的方法沒有參數,默認1小時 |
repeatSecondlyForTotalCount(int count, int seconds) | SimpleScheduleBuilder | 以給定的秒數數間隔重複給定的次數 | 重載的方法沒有seconds參數,默認1秒 |
repeatMinutelyForTotalCount(int count, int minutes) | SimpleScheduleBuilder | 以給定的分鐘數數間隔重複給定的次數 | 重載的方法沒有seconds參數,默認1分鐘 |
repeatHourlyForTotalCount(int count, int hours) | SimpleScheduleBuilder | 以給定的小時數間隔重複給定的次數 | 重載的方法沒有seconds參數,默認1小時 |
上面表格中的方法基本包含了設置SimpleTrigger所有方法,可以看出主要是通過TriggerBuilder和SimpleScheduleBuilder來設置的。其中關於結束時間我們需要注意endTime屬性的值會覆蓋設置重複次數的屬性值。很好理解,假如你設置開始時間爲早上8點,結束時間爲早上9點,每間隔10分鐘執行一次,你是不需要去設置重複次數的,設置了也會被Quertz自動計算的重複次數覆蓋。
另一方面,TriggerBuilder(以及Quartz的其它builder)會爲那些沒有被顯式設置的屬性選擇合理的默認值。比如:如果你沒有調用withIdentity(…)方法,TriggerBuilder會爲trigger生成一個隨機的名稱;如果沒有調用startAt(…)方法,則默認使用當前時間,即trigger立即生效。
例子代碼
指定開始時間和結束時間,每隔10秒執行一次
Date startTime =DateBuilder.dateOf(12, 12, 12, 20, 4, 2019);
Date endTime =DateBuilder.dateOf(12, 14, 12, 20, 4, 2019);
Trigger trigger = TriggerBuilder
.newTrigger().withIdentity("simperTrigger1", "test1")
.startAt(startTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(10))
.endAt(endTime)
.build();
SimpleTrigger的Misfire策略
關於Trigge的MisFire策略在之前的學習中已經接觸過了,這裏在詳細分不同的Trigger來學習一下。在Trigger中關於SimpleTrigger的Misfire策略常量如下,並且可以通過SimpleSchedulerBuilder設置
MISFIRE_INSTRUCTION_FIRE_NOW
設置方法:
withMisfireHandlingInstructionFireNow
含義:
——以當前時間爲觸發頻率立即觸發執行
——執行至EndTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,EndTIme根據剩餘次數和當前時間計算得到
——調整後的EndTIme會略大於根據StartTime計算的到的EndTIme值
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
設置方法:
withMisfireHandlingInstructionIgnoreMisfires
含義:
——以錯過的第一個頻率時間立刻開始執行
——重做錯過的所有頻率週期
——當下一次觸發頻率發生時間大於當前時間以後,按照Interval的依次執行剩下的頻率
——共執行RepeatCount+1次
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_CO
設置方法:withMisfireHandlingInstructionNowWithExistingCount
含義:
——以當前時間爲觸發頻率立即觸發執行
——執行至EndTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,EndTIme根據剩餘次數和當前時間計算得到
——調整後的EndTIme會略大於根據StartTime計算的到的EndTIme值
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
設置方法:withMisfireHandlingInstructionNowWithRemainingCount
含義:
——以當前時間爲觸發頻率立即觸發執行
——執行至EndTIme的剩餘週期次數
——以調度或恢復調度的時刻爲基準的週期頻率,EndTIme根據剩餘次數和當前時間計算得到
——調整後的EndTIme會略大於根據StartTime計算的到的EndTIme值
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
設置方法:withMisfireHandlingInstructionNextWithRemainingCount
含義:
——不觸發立即執行
——等待下次觸發頻率週期時刻,執行至EndTIme的剩餘週期次數
——以StartTime爲基準計算週期頻率,並得到EndTIme
——即使中間出現pause,resume以後保持EndTIme時間不變
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
設置方法:withMisfireHandlingInstructionNextWithExistingCount
含義:
——此指令導致trigger忘記原始設置的StartTime和repeat-count
——觸發器的repeat-count將被設置爲剩餘的次數
——這樣會導致後面無法獲得原始設定的StartTime和repeat-count值
默認策略
查看源碼,SimpleScheduleBuilder中misfireInstruction的默認值是MISFIRE_INSTRUCTION_SMART_POLICY,這是所有Trigger默認的MisFire策略,這個策略會根據Trigger的狀態和類型來自動調節MisFire策略。
查看源碼可以看到,若設置爲默認策略,則按照以下規則來選擇MisFire策略
- 如果重複計數爲0,則指令將解釋爲MISFIRE_INSTRUCTION_FIRE_NOW。
- 如果重複計數爲REPEAT_INDEFINITELY,則指令將解釋爲MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT。 警告:如果觸發器具有非空的結束時間,則使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT可能會導致觸發器在失火時間範圍內到達結束時,不會再次觸發。
- 如果重複計數大於0,則指令將解釋爲MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT。
CronTrigger
CronTrigger能精確的制定時間和時間間隔,可以通過設置Cron Expressions來配置CronTrigger,Cron Expressions是由七個子表達式組成的字符串,用於描述日程表的各個細節。具體怎麼設置可與參照在線Cron表達式生成器,你甚至可以把它內嵌到你的項目中,用於生成cron表達式。
構建CronTrigger
CronTrigger實例使用TriggerBuilder(用於觸發器的主要屬性)和CronScheduleBuilder(對於CronTrigger特定的屬性)構建。
例如,構建一個觸發器,每天早上9點至下午6點運行,每一30分鐘執行一次。
先通過在線CronB表達式生成器生成表達式:0 0/30 9-18 * * ?
//構建CronTrigger
TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/30 9-18 * * ? "))
.forJob("jobA", "groupA")
.build();
CronTrigger Misfire
CronTrigger的Misfire有三種如下,可以通過CronSchedulerBuilder設置
MISFIRE_INSTRUCTION_DO_NOTHING
設置方法:withMisfireHandlingInstructionDoNothing
含義:
——不觸發立即執行
——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
設置方法:withMisfireHandlingInstructionIgnoreMisfires
含義:
——以錯過的第一個頻率時間立刻開始執行
——重做錯過的所有頻率週期後
——當下一次觸發頻率發生時間大於當前時間後,再按照正常的Cron頻率依次執行
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
設置方法:withMisfireHandlingInstructionFireAndProceed
含義:
——以當前時間爲觸發頻率立刻觸發一次執行
——然後按照Cron頻率依次執行
默認策略
在SimpleTrigger中已經提到所有trigger的默認Misfire策略都是MISFIRE_INSTRUCTION_SMART_POLICY,SimpleTrigger會根據tirgger的狀態來調整具體的Misfire策略,而CronTrigger的默認Misfire策略會被CronTrigger解釋爲MISFIRE_INSTRUCTION_FIRE_NOW,具體可以參照CronTrigger實現類的源碼