misfire用于Trigger觸發(fā)時,線程池中沒有可用的線程或者調(diào)度器關(guān)閉了,此時這個Trigger變?yōu)閙isfire。當(dāng)下次調(diào)度器啟動或者有可以線程時,會檢查處于misfire狀態(tài)的Trigger。而misfire的狀態(tài)值決定了調(diào)度器如何處理這個Trigger。
最好的文檔是官方文檔。
以下轉(zhuǎn)自http://blog.sina.com.cn/s/blog_56d8ea900101eu45.html
只有一個線程、多個job
第一個job產(chǎn)生misfire(executeTime>Interval) 且是repeatForever 那么只會運行第一個job,后面所有job都無法運行第一個job產(chǎn)生misfire(executeTime>Interval) 且是withRepeatCount(N),默認(rèn)情況下(withMisfireHandlingInstructionNowWithExistingCount),第一個job執(zhí)行完后會執(zhí)行第二個job;但如果第二個job對應(yīng)的trigger設(shè)置為:withMisfireHandlingInstructionNextWithExistingCount 或者withMisfireHandlingInstructionNextWithRemainingCount那么第二個job永遠(yuǎn)也不會執(zhí)行,因為Schedule在一開始就計算好了每個Job的FinalTime(通過調(diào)用trigger的getFinalFireTime()方法可以得到),過了這個時間就不再執(zhí)行,但是如果開始執(zhí)行job2時還沒有超過它的FinalTime,系統(tǒng)也會執(zhí)行job2,但是最終得到的執(zhí)行次數(shù)將小于job2定義的withRepeatCountN個線程,M個job如果每個job都misfire(executeTime>Interval)且都是repeatForever,那么系統(tǒng)只會執(zhí)行前N個job,后面的job不會執(zhí)行如果到了執(zhí)行時間點前一任務(wù)還在執(zhí)行中,但是這時有空閑的線程,那么馬上又會執(zhí)行,這樣一來就會存在同一job被并行執(zhí)行;很多時候我們是禁止這樣的,為了禁止job在同一時間并行運行,需要在job類上加上標(biāo)簽:@DisallowConcurrentExecutionquartz有個全局的參數(shù)misfireThreshold設(shè)置可以允許的超時時間,超過了就不執(zhí)行,未超過就執(zhí)行。比如設(shè)置了misfireThreshold=30分鐘,如果一個任務(wù)定時在10:30執(zhí)行,但在10:29服務(wù)器掛了,在10:50啟動,雖然任務(wù)超時了21分鐘,但小于misfireThreshold,所以還是可以執(zhí)行。而如果服務(wù)器11:10才啟動,那就misfire了。對于周期性的任務(wù),如果有misfire的情況出現(xiàn),則會自動更新CronTrigger的時間周期默認(rèn)情況下會在當(dāng)前時間馬上執(zhí)行前一個被misfire的任務(wù)而如果設(shè)置MISFIRE_INSTRUCTION_DO_NOTHING,則不對misfire的任務(wù)做特殊處理,只從當(dāng)前時間之后的下一次正常調(diào)度時間開始執(zhí)行產(chǎn)生misfire的前提是:到了該觸發(fā)執(zhí)行時上一個執(zhí)行還未完成,且線程池中沒有空閑線程可以使用(或有空閑線程可以使用但job設(shè)置為@DisallowConcurrentExecution)且過期時間已經(jīng)超過misfireThreshold滿足以上條件就會觸發(fā)quartz的misfire; 如果產(chǎn)生misfire,quartz有多種處理策略:下面是各種不同triigger對應(yīng)的不同misfire策略CronTriggerwithMisfireHandlingInstructionDoNothing——不觸發(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í)行SimpleTriggerwithMisfireHandlingInstructionFireNow——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行——執(zhí)行至FinalTIme的剩余周期次數(shù)——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,F(xiàn)inalTime根據(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時間不變withMisfireHandlingInstructionNowWithExistingCount(默認(rèn))——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行——執(zhí)行至FinalTIme的剩余周期次數(shù)——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,F(xiàn)inalTime根據(jù)剩余次數(shù)和當(dāng)前時間計算得到——調(diào)整后的FinalTime會略大于根據(jù)starttime計算的到的FinalTime值withMisfireHandlingInstructionNextWithRemainingCount——不觸發(fā)立即執(zhí)行——等待下次觸發(fā)頻率周期時刻,執(zhí)行至FinalTime的剩余周期次數(shù)——以startTime為基準(zhǔn)計算周期頻率,并得到FinalTime——即使中間出現(xiàn)pause,resume以后保持FinalTime時間不變withMisfireHandlingInstructionNowWithRemainingCount——以當(dāng)前時間為觸發(fā)頻率立即觸發(fā)執(zhí)行——執(zhí)行至FinalTIme的剩余周期次數(shù)——以調(diào)度或恢復(fù)調(diào)度的時刻為基準(zhǔn)的周期頻率,F(xiàn)inalTime根據(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值http://blog.sina.com.cn/s/blog_613904cc0101gajk.htmlhttp://my.oschina.net/chenleijava/blog/109904good:http://hedatou.com/archives/introduction_to_quartz.html上面的狀態(tài)和quartz-1.8.4 不符:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/:cron狀態(tài):MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:就是MISFIRE_INSTRUCTION_SMART_POLICYMISFIRE_INSTRUCTION_DO_NOTHINGsimple狀態(tài),MISFIRE_INSTRUCTION_SMART_POLICY依據(jù)不同的repeatCount會有不同的對應(yīng)結(jié)果:MISFIRE_INSTRUCTION_FIRE_NOW:MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:
|
新聞熱點
疑難解答