1.場景
①因為工作執行緒都在忙碌,所以導致某些Trigger得不到觸發
也就是預設10個工作執行緒而我有15個Trigger同時觸發
這就導致有5個不能被觸發,而不幸的是Trigger所關聯的Job執行時間特別長
如果某些Trigger超過指定的閾值那麼就不會觸發
②Scheduler掛掉了。。。某些時刻又恢復了
③如果你設定的時間早於現在,中有一個StartAt
2.閾值是多少
RAMJobStore預設是5s,DBJobStore是60s
為了統一閾值,在初始化的時候,會讀取內建的quartz.config檔案,統一設定成60s
private TimeSpan misfireThreshold = TimeSpan.FromSeconds(5);
quartz.jobStore.misfireThreshold = 60000
3.Misfire的策略
①錯過幾次讓它立刻執行,後面正常排程
②錯過的幾次讓他合併成一次執行,後面正常排程
③忽略錯誤的次數,正常排程
4.SimpleScheduler怎麼使用Mrsfire策略
one
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInSeconds(1) //.WithMisfireHandlingInstructionFireNow() ) .Build(); await scheduler.ScheduleJob(job,trigger);
repeat count
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionIgnoreMisfires() ) .Build(); await scheduler.ScheduleJob(job,trigger);
①WithMisfireHandlingInstructionNextWithExistingCount
比如說StartTime:7:00,每小時執行一次,現在時間是10:40也就是錯過了4次 ,本來是11次 7+11=18點結束
也就是下次觸發的時間 StartTime:22:00開始 重複執行11次 11+11=22點結束
也就是說任然會保留11次執行
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNextWithExistingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
②WithMisfireHandlingInstructionNextWithRemainingCount
比如說StartTime:7:00,每小時執行一次,現在時間是10:40也就是錯過了4次 ,本來是11次 7+11=18點結束
也就是下次觸發的時間 StartTime:22:00開始 重複執行11-4次 ,不管錯過的4次,正常排程,7+11=18點結束
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNextWithRemainingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
③WithMisfireHandlingInstructionNowWithExistingCount
比如說StartTime:7:00,每小時執行一次,現在時間是10:40也就是錯過了4次 ,本來是11次 7+11=18點結束
也就是下次觸發的時間 StartTime=Now開始 重複執行11次 10.40+11=21.40結束
也就是說任然會保留11次執行,但是會從現在開始
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNowWithExistingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
④WithMisfireHandlingInstructionNowWithRemainingCount
比如說StartTime:7:00,每小時執行一次,現在時間是10:40也就是錯過了4次 ,本來是11次 7+11=18點結束
也就是下次觸發的時間 StartTime=Now開始 重複執行11-4次 ,不管錯過的4次,正常排程,7+10:40=17:40點結束
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNowWithRemainingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
5.Cronscheduler如何使用Misfire策略
①WithMisfireHandlingInstructionFireAndProceed
錯過的合併成一次執行,不修改排程時間
也就說假如StartTime=10:00 現在時間13:16 那麼將合併成一次執行
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionFireAndProceed() ) .Build();
②WithMisfireHandlingInstructionIgnoreMisfires
錯過的立即追趕,然後正常排程
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionIgnoreMisfires() ) .Build();
③WithMisfireHandlingInstructionDoNothing
錯過的不管,正常執行
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionDoNothing() ) .Build();