quartz-misfire 错失、补偿执行
生活随笔
收集整理的這篇文章主要介紹了
quartz-misfire 错失、补偿执行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
調度(scheduleJob)或恢復調度(resumeTrigger,resumeJob)后不同的misfire對應的處理規則
misfire產生的條件是:到了該觸發執行時上一個執行還未完成,且線程池中沒有空閑線程可以使用(或有空閑線程可以使用但job設置為@DisallowConcurrentExecution)且過期時間已經超過misfireThreshold就認為是misfire了,錯失觸發了
比如:13:07:24開始執行,重復執行5次,開始執行時,quartz已經計算好每次調度的時間刻,分別如下:
03:33:36,03:33:39,03:33:42,03:33:45,03:33:48,03:33:51
如果第一次執行時間為11s,到03:33:47結束,03:33:47減去03:33:39的時間間隔是8s,如果misfireThreshold設置的時間小于等于8s間隔,則認為是misfire了,如果大于8s間隔,則認為沒有misfire。
CronTrigger
CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");csb.withMisfireHandlingInstructionDoNothing(); csb.withMisfireHandlingInstructionFireAndProceed();(默認) csb.withMisfireHandlingInstructionIgnoreMisfires(); withMisfireHandlingInstructionDoNothing ——不觸發立即執行 ——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行 withMisfireHandlingInstructionIgnoreMisfires ——以錯過的第一個頻率時間立刻開始執行 ——重做錯過的所有頻率周期后 ——當下一次觸發頻率發生時間大于當前時間后,再按照正常的Cron頻率依次執行 withMisfireHandlingInstructionFireAndProceed(默認) ——以當前時間為觸發頻率立刻觸發一次執行 ——然后按照Cron頻率依次執行SimpleTrigger
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值misfireHandler線程
下面這些原因可能造成 misfired job:
執行流程:
misfireHandler線程執行流程如下圖所示:
總結
以上是生活随笔為你收集整理的quartz-misfire 错失、补偿执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 啤酒500ml和330ml哪个划算
- 下一篇: 上供品可以吃荔枝吗?