日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

quartz-misfire 错失、补偿执行

發(fā)布時間:2024/9/27 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 quartz-misfire 错失、补偿执行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

調(diào)度(scheduleJob)或恢復(fù)調(diào)度(resumeTrigger,resumeJob)后不同的misfire對應(yīng)的處理規(guī)則
misfire產(chǎn)生的條件是:到了該觸發(fā)執(zhí)行時上一個執(zhí)行還未完成,且線程池中沒有空閑線程可以使用(或有空閑線程可以使用但job設(shè)置為@DisallowConcurrentExecution)且過期時間已經(jīng)超過misfireThreshold就認(rèn)為是misfire了,錯失觸發(fā)了

比如:13:07:24開始執(zhí)行,重復(fù)執(zhí)行5次,開始執(zhí)行時,quartz已經(jīng)計算好每次調(diào)度的時間刻,分別如下:

03:33:36,03:33:39,03:33:42,03:33:45,03:33:48,03:33:51

如果第一次執(zhí)行時間為11s,到03:33:47結(jié)束,03:33:47減去03:33:39的時間間隔是8s,如果misfireThreshold設(shè)置的時間小于等于8s間隔,則認(rèn)為是misfire了,如果大于8s間隔,則認(rèn)為沒有misfire。

CronTrigger

CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");csb.withMisfireHandlingInstructionDoNothing(); csb.withMisfireHandlingInstructionFireAndProceed();(默認(rèn)) csb.withMisfireHandlingInstructionIgnoreMisfires(); withMisfireHandlingInstructionDoNothing ——不觸發(fā)立即執(zhí)行 ——等待下次Cron觸發(fā)頻率到達(dá)時刻開始按照Cron頻率依次執(zhí)行 withMisfireHandlingInstructionIgnoreMisfires ——以錯過的第一個頻率時間立刻開始執(zhí)行 ——重做錯過的所有頻率周期后 ——當(dāng)下一次觸發(fā)頻率發(fā)生時間大于當(dāng)前時間后,再按照正常的Cron頻率依次執(zhí)行 withMisfireHandlingInstructionFireAndProceed(默認(rèn)) ——以當(dāng)前時間為觸發(fā)頻率立刻觸發(fā)一次執(zhí)行 ——然后按照Cron頻率依次執(zhí)行

SimpleTrigger

SimpleScheduleBuilder ssb = SimpleScheduleBuilder.simpleSchedule();ssb.withMisfireHandlingInstructionFireNow(); ssb.withMisfireHandlingInstructionIgnoreMisfires(); ssb.withMisfireHandlingInstructionNextWithExistingCount(); ssb.withMisfireHandlingInstructionNextWithRemainingCount(); ssb.withMisfireHandlingInstructionNowWithExistingCount();  (默認(rèn)) ssb.withMisfireHandlingInstructionNowWithRemainingCount(); withMisfireHandlingInstructionFireNow ——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行 ——執(zhí)行至FinalTIme的剩余周期次數(shù) ——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,FinalTime根據(jù)剩余次數(shù)和當(dāng)前時間計算得到 ——調(diào)整后的FinalTime會略大于根據(jù)starttime計算的到的FinalTime值 withMisfireHandlingInstructionIgnoreMisfires ——以錯過的第一個頻率時間立刻開始執(zhí)行 ——重做錯過的所有頻率周期 ——當(dāng)下一次觸發(fā)頻率發(fā)生時間大于當(dāng)前時間以后,按照Interval的依次執(zhí)行剩下的頻率 ——共執(zhí)行RepeatCount+1次 withMisfireHandlingInstructionNextWithExistingCount ——不觸發(fā)立即執(zhí)行 ——等待下次觸發(fā)頻率周期時刻,執(zhí)行至FinalTime的剩余周期次數(shù) ——以startTime為基準(zhǔn)計算周期頻率,并得到FinalTime ——即使中間出現(xiàn)pause,resume以后保持FinalTime時間不變 withMisfireHandlingInstructionNextWithRemainingCount ——不觸發(fā)立即執(zhí)行 ——等待下次觸發(fā)頻率周期時刻,執(zhí)行至FinalTime的剩余周期次數(shù) ——以startTime為基準(zhǔn)計算周期頻率,并得到FinalTime ——即使中間出現(xiàn)pause,resume以后保持FinalTime時間不變 withMisfireHandlingInstructionNowWithExistingCount(默認(rèn)) ——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行 ——執(zhí)行至FinalTIme的剩余周期次數(shù) ——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,FinalTime根據(jù)剩余次數(shù)和當(dāng)前時間計算得到 ——調(diào)整后的FinalTime會略大于根據(jù)starttime計算的到的FinalTime值 withMisfireHandlingInstructionNowWithRemainingCount ——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行 ——執(zhí)行至FinalTIme的剩余周期次數(shù) ——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,FinalTime根據(jù)剩余次數(shù)和當(dāng)前時間計算得到 ——調(diào)整后的FinalTime會略大于根據(jù)starttime計算的到的FinalTime值MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT ——此指令導(dǎo)致trigger忘記原始設(shè)置的starttime和repeat-count ——觸發(fā)器的repeat-count將被設(shè)置為剩余的次數(shù) ——這樣會導(dǎo)致后面無法獲得原始設(shè)定的starttime和repeat-count值

misfireHandler線程

下面這些原因可能造成 misfired job:

  • 系統(tǒng)因?yàn)槟承┰虮恢貑ⅰT谙到y(tǒng)關(guān)閉到重新啟動之間的一段時間里,可能有些任務(wù)會被 misfire;
  • Trigger 被暫停(suspend)的一段時間里,有些任務(wù)可能會被 misfire;
  • 線程池中所有線程都被占用,導(dǎo)致任務(wù)無法被觸發(fā)執(zhí)行,造成 misfire;
  • 有狀態(tài)任務(wù)在下次觸發(fā)時間到達(dá)時,上次執(zhí)行還沒有結(jié)束;為了處理 misfired job,Quartz 中為 trigger 定義了處理策略,主要有下面兩種:MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:針對 misfired job 馬上執(zhí)行一次;MISFIRE_INSTRUCTION_DO_NOTHING:忽略 misfired job,等待下次觸發(fā);默認(rèn)是MISFIRE_INSTRUCTION_SMART_POLICY,該策略在CronTrigger中=MISFIRE_INSTRUCTION_FIRE_ONCE_NOW線程默認(rèn)1分鐘執(zhí)行一次;在一個事務(wù)中,默認(rèn)一次最多recovery 20個;
  • 執(zhí)行流程:

  • 若配置(默認(rèn)為true,可配置)成獲取鎖前先檢查是否有需要recovery的trigger,先獲取misfireCount;
  • 獲取TRIGGER_ACCESS鎖;
  • hasMisfiredTriggersInState:獲取misfired的trigger,默認(rèn)一個事務(wù)里只能最大20個misfired trigger(可配置),misfired判斷依據(jù):status=waiting,next_fire_time < current_time-misfirethreshold(可配置,默認(rèn)1min)
  • notifyTriggerListenersMisfired
  • updateAfterMisfire:獲取misfire策略(默認(rèn)是MISFIRE_INSTRUCTION_SMART_POLICY,該策略在CronTrigger中=MISFIRE_INSTRUCTION_FIRE_ONCE_NOW),根據(jù)策略更新nextFireTime;
  • 將nextFireTime等更新到trigger表;
  • commit connection,釋放鎖
  • 如果還有更多的misfired,sleep短暫時間(為了集群負(fù)載均衡),否則sleep misfirethreshold時間,后繼續(xù)輪詢;
  • misfireHandler線程執(zhí)行流程如下圖所示:

    總結(jié)

    以上是生活随笔為你收集整理的quartz-misfire 错失、补偿执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。