• Quartz.NET哑火策略Misfire


    这一篇将介绍Quartz.NET的哑火策略(Misfire),直接上图:
     
     
    具体的例子如下:
    任务类MyJob:
        public class MyJob : IJob
        {
            
            public void Execute(IJobExecutionContext context)
            {
                Console.WriteLine("本地执行时间:{0},下次执行时间:{1}",
                    context.ScheduledFireTimeUtc.Value.ToOffset(TimeSpan.FromHours(8)).ToString("yyyy-MM-dd HH:mm:ss"),
                    context.NextFireTimeUtc.Value.ToOffset(TimeSpan.FromHours(8)).ToString("yyyy-MM-dd HH:mm:ss")
                    );
                
            }
        }
     
    1. WithMisfireHandlingInstructionFireNow(不追赶哑火,如果有触发哑火,立即执行,更新下次执行时间)
                var scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                //将键值对传给定时器
                var job = JobBuilder.Create<MyJob>()
                                                     .Build();
    
                var trigger = TriggerBuilder.Create()
                                                    .StartAt(DateBuilder.DateOf(7,0,0))
                                                    .WithSimpleSchedule(m => 
                                                        m.WithIntervalInHours(1)
                                                            .WithRepeatCount(100)
                                                            //如果有触发哑火,立即执行,如果之前定义的是12:00触发,调度时间变成了现在的时间
                                                            .WithMisfireHandlingInstructionFireNow()    
                                                    ).Build();
    
                scheduler.ScheduleJob(job, trigger);
    执行结果如下:
     
    2. WithMisfireHandlingInstructionIgnoreMisfires(错过的立即追赶,下次执行时间不变)
                var scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                //将键值对传给定时器
                var job = JobBuilder.Create<MyJob>()
                                                    .UsingJobData("count", 0)
                                                    .Build();
    
                var trigger = TriggerBuilder.Create()
                                                    .StartAt(DateBuilder.DateOf(7, 0, 0))
                                                    .WithSimpleSchedule(m =>
                                                        m.WithIntervalInHours(1)
                                                            .WithRepeatCount(100)
                                                            //错过的立即追赶,然后正常调度
                                                            .WithMisfireHandlingInstructionIgnoreMisfires()
                                                    ).Build();
    
                scheduler.ScheduleJob(job, trigger);
    执行结果如下
     
    3. WithMisfireHandlingInstructionNext(不追赶哑火,正常执行,由于是正常执行下次执行时间不变了)
                var scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                //将键值对传给定时器
                var job = JobBuilder.Create<MyJob>()
                                                     .Build();
    
                var trigger = TriggerBuilder.Create()
                                                    .StartAt(DateBuilder.DateOf(7, 0, 0))
                                                    .WithSimpleSchedule(m =>
                                                             m.WithIntervalInHours(1)
                                                            .WithRepeatCount(100)
                                                            //正常调度,执行次数 = 预计执行次数 - 错过的次数
                                                            //.WithMisfireHandlingInstructionNextWithRemainingCount()
                                                            //正常调度,执行次数不变
                                                            .WithMisfireHandlingInstructionNextWithExistingCount()
                                                    ).Build();
    
                scheduler.ScheduleJob(job, trigger);
    执行结果如下:
     
    4. WithMisfireHandlingInstructionNow (立即执行,但不追赶哑火的,更新下次执行时间)
                var scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                //将键值对传给定时器
                var job = JobBuilder.Create<MyJob>()
                                                     .Build();
    
                var trigger = TriggerBuilder.Create()
                                                     .StartAt(DateBuilder.DateOf(7, 0, 0))
                                                    .WithSimpleSchedule(m =>
                                                        m.WithIntervalInHours(1)
                                                            .WithRepeatCount(100)
                                                            //立即执行,执行次数 = 预计执行次数 - 错过的次数
                                                            //.WithMisfireHandlingInstructionNowWithRemainingCount()
                                                            //立即执行,执行次数不变
                                                            .WithMisfireHandlingInstructionNowWithExistingCount()
                                                    ).Build();
    
                scheduler.ScheduleJob(job, trigger);
    执行结果如下:
     
    5. WithMisfireHandlingInstructionFireAndProceed(哑火的任务合并到一次执行,下次正常执行)
                var scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                //将键值对传给定时器
                var job = JobBuilder.Create<MyJob>()
                                                     .Build();
    
                var trigger = TriggerBuilder.Create()
                                                    .StartAt(DateBuilder.DateOf(7, 0, 0))
                                                    .WithCronSchedule("0 0 7-20 ? * MON-FRI",   //7AM - 8PM每小时执行一次
                                                        //哑火的任务合并到一次执行,下次正常执行
                                                        m => m.WithMisfireHandlingInstructionFireAndProceed()
                                                        //追赶执行哑火的任务,下次正常执行
                                                        //m => m.WithMisfireHandlingInstructionIgnoreMisfires()
                                                        //什么都不做,下次正常执行
                                                        //m => m.WithMisfireHandlingInstructionDoNothing()
                                                    )
                                                    .Build();
    
                scheduler.ScheduleJob(job, trigger);
    执行结果如下:
     
    6. WithMisfireHandlingInstructionIgnoreMisfires(追赶执行哑火的任务,下次正常执行)
    将5的 m => m.WithMisfireHandlingInstructionIgnoreMisfires()取消注释后,运行结果如下:
     
    7. WithMisfireHandlingInstructionDoNothing(什么都不做,下次正常执行)
    将5的 m => m.WithMisfireHandlingInstructionDoNothing()取消注释后,运行结果如下:
     
     
     

  • 相关阅读:
    ROC曲线
    数学建模的时间表和分工
    找寻子串
    被7整除
    Java中BufferedReader和scanner的对比
    机器学习降维方法
    梯度下降法
    天池大赛
    统一认证系统(三)
    软件设计方案
  • 原文地址:https://www.cnblogs.com/AlexanderArima/p/12170417.html
Copyright © 2020-2023  润新知