Quartz.NET哑火策略Misfire

这一篇将介绍Quartz.NET的哑火策略(Misfire),直接上图:
Quartz.NET哑火策略Misfire_第1张图片
 
 
具体的例子如下:
任务类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() .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() .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() .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() .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() .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()取消注释后,运行结果如下:
 
 
 

你可能感兴趣的:(Quartz.NET哑火策略Misfire)