Quartz.Net系列(十六):Misfire策略在SimpleScheduler和CronScheduler中的使用

IT技術派發表於2020-07-15

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();

 

相關文章