misfire產生的條件是:到了該觸發執行時上一個執行還未完成,且線程池中沒有空閒線程可使用(或有空閒線程可使用但job設置爲@DisallowConcurrentExecution)且過時時間已經超過misfireThreshold就認爲是misfire了,錯失觸發了java
好比:13:07:24開始執行,重複執行5次,開始執行時,quartz已經計算好每次調度的時間刻,分別以下:負載均衡
03:33:36,03:33:39,03:33:42,03:33:45,03:33:48,03:33:51ui
若是第一次執行時間爲11s,到03:33:47結束,03:33:47減去03:33:39的時間間隔是8s,若是misfireThreshold設置的時間小於等於8s間隔,則認爲是misfire了,若是大於8s間隔,則認爲沒有misfire。線程
CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); csb.withMisfireHandlingInstructionDoNothing(); csb.withMisfireHandlingInstructionFireAndProceed();(默認) csb.withMisfireHandlingInstructionIgnoreMisfires();
withMisfireHandlingInstructionDoNothing ——不觸發當即執行 ——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行
withMisfireHandlingInstructionIgnoreMisfires ——以錯過的第一個頻率時間馬上開始執行 ——重作錯過的全部頻率週期後 ——當下一次觸發頻率發生時間大於當前時間後,再按照正常的Cron頻率依次執行
withMisfireHandlingInstructionFireAndProceed(默認) ——以當前時間爲觸發頻率馬上觸發一次執行 ——而後按照Cron頻率依次執行
SimpleScheduleBuilder ssb = SimpleScheduleBuilder.simpleSchedule(); ssb.withMisfireHandlingInstructionFireNow(); ssb.withMisfireHandlingInstructionIgnoreMisfires(); ssb.withMisfireHandlingInstructionNextWithExistingCount(); ssb.withMisfireHandlingInstructionNextWithRemainingCount(); ssb.withMisfireHandlingInstructionNowWithExistingCount(); (默認) ssb.withMisfireHandlingInstructionNowWithRemainingCount();
withMisfireHandlingInstructionFireNow ——以當前時間爲觸發頻率當即觸發執行 ——執行至FinalTIme的剩餘週期次數 ——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得 ——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值
withMisfireHandlingInstructionIgnoreMisfires ——以錯過的第一個頻率時間馬上開始執行 ——重作錯過的全部頻率週期 ——當下一次觸發頻率發生時間大於當前時間之後,按照Interval的依次執行剩下的頻率 ——共執行RepeatCount+1次
withMisfireHandlingInstructionNextWithExistingCount ——不觸發當即執行 ——等待下次觸發頻率週期時刻,執行至FinalTime的剩餘週期次數 ——以startTime爲基準計算週期頻率,並獲得FinalTime ——即便中間出現pause,resume之後保持FinalTime時間不變
withMisfireHandlingInstructionNextWithRemainingCount ——不觸發當即執行 ——等待下次觸發頻率週期時刻,執行至FinalTime的剩餘週期次數 ——以startTime爲基準計算週期頻率,並獲得FinalTime ——即便中間出現pause,resume之後保持FinalTime時間不變
withMisfireHandlingInstructionNowWithExistingCount(默認) ——以當前時間爲觸發頻率當即觸發執行 ——執行至FinalTIme的剩餘週期次數 ——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得 ——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值
withMisfireHandlingInstructionNowWithRemainingCount ——以當前時間爲觸發頻率當即觸發執行 ——執行至FinalTIme的剩餘週期次數 ——以調度或恢復調度的時刻爲基準的週期頻率,FinalTime根據剩餘次數和當前時間計算獲得 ——調整後的FinalTime會略大於根據starttime計算的到的FinalTime值 MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT ——此指令致使trigger忘記原始設置的starttime和repeat-count ——觸發器的repeat-count將被設置爲剩餘的次數 ——這樣會致使後面沒法得到原始設定的starttime和repeat-count值
下面這些緣由可能形成 misfired job:3d
執行流程:blog
misfireHandler線程執行流程以下圖所示:事務