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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM