这一篇将介绍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()取消注释后,运行结果如下: