Quartz學習筆記(四)SimpleTrigger,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實現類的源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章