zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    std::sort运行出core(segment fault)
    C++编译报错:重复定义
    《改变世界的九大算法》读书笔记
    简单排序实现
    Django 常见错误总结
    python 进行机器学习
    python中matplotlib 的简单使用
    十四:生成器函数和迭代器函数
    十三:装饰器函数
    十二:重要的内置函数
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13305214.html
Copyright © 2011-2022 走看看