Quartz.NET的哑火策略Misfire

这一篇将介绍Quartz.NET的哑火策略(Misfire),直接上图:

WithSimpleSchedule的哑火策略

WithMisfireHandlingInstructionFireNow

不追赶哑火,如果有触发哑火,立即执行,更新下次执行时间

WithMisfireHandlingInstructionIgnoreMisfires

错过的立即追赶,下次执行时间不变

WithMisfireHandlingInstructionNext

WithRemainingCount

不追赶哑火,正常执行,由于是正常执行下次执行时间不变了(执行次数 = 预计执行次数 - 错过的次数)

WithExistingCount

不追赶哑火,正常执行,由于是正常执行下次执行时间不变了(执行次数不变)

WithMisfireHandlingInstructionNow

WithRemainingCount

立即执行,但不追赶哑火的,更新下次执行时间(执行次数 = 预计执行次数 - 错过的次数)

WithExistingCount

立即执行,但不追赶哑火的,更新下次执行时间(执行次数不变)

WithCronSchedule的哑火策略

WithMisfireHandlingInstructionFireAndProceed

 

哑火的任务合并到一次执行,下次正常执行

WithMisfireHandlingInstructionIgnoreMisfires

 

追赶执行哑火的任务,下次正常执行

WithMisfireHandlingInstructionDoNothing

 

什么都不做,下次正常执行

具体的例子如下:

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

相关链接:

Quartz.NET中Job和Trigger的常用方法

Quartz.NET中设置特定日期的Calendar   

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章