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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :

發(fā)布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 : 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 簡介

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)容,希望文章能夠幫你解決所遇到的問題。

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