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()取消注释后,运行结果如下:
 
 
 

posted @ 2020-01-09 11:17  绿龙术士  阅读(610)  评论(0编辑  收藏  举报