天天看點

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的政策

①錯過幾次讓它立刻執行,後面正常排程

②錯過的幾次讓他合并成一次執行,後面正常排程

③忽略錯誤的次數,正常排程

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

 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);      
Quartz.Net系列(十六):Misfire政策在SimpleScheduler和CronScheduler中的使用

①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);      
Quartz.Net系列(十六):Misfire政策在SimpleScheduler和CronScheduler中的使用

 ④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);      
Quartz.Net系列(十六):Misfire政策在SimpleScheduler和CronScheduler中的使用

 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();      
Quartz.Net系列(十六):Misfire政策在SimpleScheduler和CronScheduler中的使用

②WithMisfireHandlingInstructionIgnoreMisfires

錯過的立即追趕,然後正常排程

var trigger = TriggerBuilder.Create()
                                                  .StartAt(DateBuilder.DateOf(10, 0, 0))
                                                  .WithCronSchedule("0 0 9-18 ? * MON-FRI",
                                                                    x=>x.WithMisfireHandlingInstructionIgnoreMisfires()
                                                                   )
                                                .Build();      
Quartz.Net系列(十六):Misfire政策在SimpleScheduler和CronScheduler中的使用

 ③WithMisfireHandlingInstructionDoNothing

錯過的不管,正常執行

var trigger = TriggerBuilder.Create()
                                                  .StartAt(DateBuilder.DateOf(10, 0, 0))
                                                  .WithCronSchedule("0 0 9-18 ? * MON-FRI",
                                                                    x=>x.WithMisfireHandlingInstructionDoNothing()
                                                                   )
                                                .Build();