第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :
一. 簡介
1. 什么是啞火
由于某些原因?qū)е掠|發(fā)器(trigger)在該觸發(fā)的時候沒有得到觸發(fā),后續(xù)對應(yīng)的解決策略即為啞火策略。(個人理解)
2. 啞火觸發(fā)的條件
①:所有的工作線程都在忙碌,導(dǎo)致某些trigger得不到觸發(fā).(如:simplethreadpool 默認(rèn)是10個工作線程,但我有15個trigger同時觸發(fā),?恰巧這10個trigger關(guān)聯(lián)的job耗時都很長,剩下的5個trigger超過了等待時間仍然沒有得到觸發(fā))
②:調(diào)度器(sheduler)中途掛了,某個時間又恢復(fù)了
③:設(shè)置的trigger的開始時間早于當(dāng)前時間
如果沒有觸發(fā)啞火的條件,則不會觸發(fā)啞火策略,之前的全部都是按照忽略來計算的,后續(xù)按照正常規(guī)律來進(jìn)行。如果不設(shè)置開始時間,即為當(dāng)前時間開始,不觸發(fā)啞火策略。
?下面介紹兩類Trigger對應(yīng)的啞火策略:SimpleTrigger和CronTrigger?(前提:案例設(shè)置時間早于當(dāng)前時間的,即都是有錯過的)
?
二. SimpleTrigger啞火策略詳解
? 這里要分三種情況來討論,執(zhí)行指定次數(shù)的情況WithRepeatCount(n),n=1、n>1、n=forever三種情況,重點(diǎn)理解n>1的情況,另外兩種都是他的特殊情況而已。
(一):執(zhí)行指定次數(shù)的情況(WithRepeatCount(n) n>1) 只要記住這種情況,下面的B和C都能分析出來
(1).默認(rèn) :立即執(zhí)行,修改當(dāng)前調(diào)度時間,總數(shù)保持不變 (等價于WithMisfireHandlingInstructionNowWithExistingCount)
詳見下面解析
(2).WithMisfireHandlingInstructionIgnoreMisfires:錯過的立即追趕,然后正常調(diào)度。
PS:設(shè)置的時間早于當(dāng)前時間,執(zhí)行的時候,會將當(dāng)前時間之前錯過的次數(shù)一次性執(zhí)行完,然后正常按照設(shè)置的開始時間及規(guī)律進(jìn)行執(zhí)行。?如果設(shè)置的RepeatCount(n)中n的次數(shù)小于錯過的次數(shù),只能執(zhí)行n次,執(zhí)行完后,將不會在執(zhí)行了,因?yàn)閳?zhí)行次數(shù)已經(jīng)用完了。
案例:設(shè)置的開始時間為8:00,每隔半小時執(zhí)行一次,執(zhí)行總次數(shù)為5次,當(dāng)前時間為9:05,那么開始時候會先執(zhí)行3次,將錯過的一次性執(zhí)行了,然后按照正常調(diào)度執(zhí)行,下一次執(zhí)行的時間為9:30,還能執(zhí)行兩次。
(3).WithMisfireHandlingInstructionNextWithExistingCount:錯過的不管了,按計劃等待下次調(diào)度,總數(shù)不變,結(jié)束時間推遲。
PS:錯過的次數(shù)不處理,仍按照設(shè)置的規(guī)律來執(zhí)行,執(zhí)行次數(shù)不變,要執(zhí)行完的RepeatCount(n)中的n.
案例:設(shè)置的開始時間為8:00,每隔半小時執(zhí)行一次,執(zhí)行總次數(shù)為5次,當(dāng)前時間為9:05,那么開始時候并沒有調(diào)度執(zhí)行,第一次執(zhí)行調(diào)度的時間為9:30,然后按照正常調(diào)度執(zhí)行,總共執(zhí)行5次,最后一次時間為11:30。
(4).WithMisfireHandlingInstructionNextWithRemainingCount:錯過的不管了,按計劃等待下次調(diào)度,但總數(shù)要減去misfire錯過的次數(shù)
PS:錯過的次數(shù)不處理,仍按照設(shè)置的規(guī)律來執(zhí)行,執(zhí)行總數(shù)要 減去 錯過的次數(shù)!
??案例:設(shè)置的開始時間為8:00,每隔半小時執(zhí)行一次,執(zhí)行總次數(shù)為5次,當(dāng)前時間為9:05,那么開始時候并沒有調(diào)度執(zhí)行,第一次執(zhí)行調(diào)度的時間為9:30,然后按照正常調(diào)度執(zhí)行,總共執(zhí)行 ? ? ?5-3=2 次,最后一次時間為10:00。
(5).WithMisfireHandlingInstructionNowWithExistingCount: 立即執(zhí)行,修改當(dāng)前調(diào)度時間,總數(shù)保持不變
PS:立即執(zhí)行,修改當(dāng)前調(diào)度時間的含義為,即使我設(shè)置的開始時間早于當(dāng)前時間,但該啞火策略會立馬執(zhí)行該觸發(fā)器,即運(yùn)行后,馬上執(zhí)行了一次,后續(xù)的時間間隔均是是以當(dāng)前執(zhí)行時間為基礎(chǔ)來進(jìn)行的,言外之意,之前設(shè)置的開始時間沒用了,執(zhí)行總數(shù)不變。
? 案例:設(shè)置的開始時間為8:00,每隔半小時執(zhí)行一次,執(zhí)行總次數(shù)為5次,當(dāng)前時間為9:05,那么開始時候立即執(zhí)行,第一次執(zhí)行調(diào)度的時間為9:05,然后以9:05為基礎(chǔ),按照正常調(diào)度規(guī)律執(zhí)行,總共執(zhí)行5次,第二次時間為9:35,最后一次執(zhí)行時間為11:05。
(6).WithMisfireHandlingInstructionNowWithRemainingCount: 立即執(zhí)行,修改當(dāng)前調(diào)度時間,總數(shù)要減去misfire錯過的次數(shù)
PS:立即執(zhí)行,修改當(dāng)前調(diào)度時間的含義為,即使我設(shè)置的開始時間早于當(dāng)前時間,但該啞火策略會立馬執(zhí)行該觸發(fā)器,即運(yùn)行后,馬上執(zhí)行了一次,后續(xù)的時間間隔均是是以當(dāng)前執(zhí)行時間為基礎(chǔ)來進(jìn)行的,言外之意,之前設(shè)置的開始時間沒用了。執(zhí)行總數(shù)要 減去 錯過的次數(shù)!
? 案例:設(shè)置的開始時間為8:00,每隔半小時執(zhí)行一次,執(zhí)行總次數(shù)為5次,當(dāng)前時間為9:05,那么開始時候立即執(zhí)行,第一次執(zhí)行調(diào)度的時間為9:05,然后以9:05為基礎(chǔ),按照正常調(diào)度規(guī)律執(zhí)行,總共執(zhí)行 5-3=2 次,第二次(即最后一次)時間為9:35。
B:只執(zhí)行一次的情況 (WithRepeatCount(n) n=1) 對A情況的一個特殊分析
(1). 默認(rèn):(等價于WithMisfireHandlingInstructionFireNow)
(2). WithMisfireHandlingInstructionFireNow:立即執(zhí)行
PS:設(shè)置的時間早于當(dāng)前時間,執(zhí)行的時候,立即把這一次執(zhí)行完,后續(xù)將不再執(zhí)行;但設(shè)置的時間晚于當(dāng)前時間,則按照正常規(guī)律進(jìn)行執(zhí)行了
(3).WithMisfireHandlingInstructionNextWithRemainingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount :不執(zhí)行了
PS:設(shè)置的時間早于當(dāng)前時間,執(zhí)行的時候按照原規(guī)律執(zhí)行,但是次數(shù)要減去錯過的次數(shù),這里總共就執(zhí)行一次,所以就不執(zhí)行了
?
C:永久執(zhí)行的情況(RepeatForever) 對A情況的一個特殊分析
(1). 默認(rèn):等價與下面的(2),按計劃的正常調(diào)度執(zhí)行,執(zhí)行次數(shù)永久執(zhí)行
(2). WithMisfireHandlingInstructionNextWithExistingCount 和 WithMisfireHandlingInstructionNextWithRemainingCount:按計劃的正常調(diào)度執(zhí)行,執(zhí)行次數(shù)永久執(zhí)行
(3). WithMisfireHandlingInstructionNowWithExistingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount: 立即執(zhí)行,執(zhí)行的開始時間改為當(dāng)前時間,執(zhí)行次數(shù)永久執(zhí)行
代碼分享:自行替換即可
1 public static void misfireShow()2 {3 //1.創(chuàng)建Schedule4 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();5 //2.創(chuàng)建job (具體的job需要單獨(dú)在一個文件中執(zhí)行)6 var job = JobBuilder.Create<HelloJob4>().Build();7 //3.配置trigger 8 //下面的四個觸發(fā)器對應(yīng)了上面四種情況的測試,時間需要根據(jù)實(shí)際情況進(jìn)行配置測試來設(shè)置9 var trigger1 = TriggerBuilder.Create().StartAt(DateBuilder.DateOf(20, 0, 0)) 10 .WithSimpleSchedule(x => x.WithIntervalInMinutes(30) 11 .WithRepeatCount(8) 12 .WithMisfireHandlingInstructionNowWithExistingCount() 13 ).Build(); 14 var trigger2 = TriggerBuilder.Create().StartAt(DateBuilder.DateOf(18, 0, 0)) 15 .WithSimpleSchedule(x => x.WithIntervalInSeconds(1) 16 .WithRepeatCount(1) 17 .WithMisfireHandlingInstructionFireNow() 18 ).Build(); 19 var trigger3 = TriggerBuilder.Create() 20 .StartAt(DateBuilder.DateOf(15, 0, 0, 5, 3, 2018)) 21 .WithSimpleSchedule(x => x.WithIntervalInMinutes(1) 22 .WithMisfireHandlingInstructionNowWithRemainingCount() 23 .RepeatForever()).Build(); 24 var trigger4 = TriggerBuilder.Create() 25 .StartAt(DateBuilder.DateOf(14, 0, 0)) 26 .WithCronSchedule("0 0-59 9-23 ? * MON-FRI",x=>x.WithMisfireHandlingInstructionIgnoreMisfires()).Build(); 27 28 //4.開始調(diào)度 29 scheduler.ScheduleJob(job, trigger1); 30 scheduler.Start(); 31 }?
三. CronTrigger啞火策略詳解
(1). 默認(rèn):錯過的合并,于當(dāng)前時間執(zhí)行一次,不修改調(diào)度時間,按計劃等待下一次調(diào)度(等價于下面的 WithMisfireHandlingInstructionFireAndProceed)
(2). WithMisfireHandlingInstructionIgnoreMisfires:錯過的立即追趕,然后正常調(diào)度
ps:錯過多少次,初次執(zhí)行的時候追趕多少次,追趕的次數(shù)的時間是按原規(guī)律執(zhí)行的時間,然后按照原規(guī)律進(jìn)行正常后續(xù)調(diào)度
(3). WithMisfireHandlingInstructionFireAndProceed:錯過的合并,于當(dāng)前時間執(zhí)行一次,不修改調(diào)度時間,按計劃等待下一次調(diào)度
PS:無論錯過多少次,均在初次運(yùn)行的時候,即當(dāng)前時間執(zhí)行一次,后續(xù)的執(zhí)行仍按照原規(guī)律進(jìn)行執(zhí)行。
(4). WithMisfireHandlingInstructionDoNothing:錯過的不管了,后續(xù)按照正常調(diào)度進(jìn)行
PS:無論錯過多少次,均忽略,后續(xù)的執(zhí)行仍按照原規(guī)律進(jìn)行執(zhí)行。
?代碼詳見上面的代碼分享
?
總結(jié)
以上是生活随笔為你收集整理的第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本周国债将迎来密集发行期,还有一批特别国
- 下一篇: 多租户技术