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   

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值