Quartz.Net系列(十七):Misfire策略在SimpleScheduler和CronScheduler中的使用
1.场景
①因为工作线程都在忙碌,所以导致某些Trigger得不到触发
也就是默认10个工作线程而我有15个Trigger同时触发
这就导致有5个不能被触发,而不幸的是Trigger所关联的Job执行时间特别长
如果某些Trigger超过指定的阈值那么就不会触发
②Scheduler挂掉了。。。某些时刻又恢复了
③如果你设置的时间早于现在,中有一个StartAt
2.阈值是多少
RAMJobStore默认是5s,DBJobStore是60s
为了统一阈值,在初始化的时候,会读取内置的quartz.config文件,统一设置成60s
private TimeSpan misfireThreshold = TimeSpan.FromSeconds(5);
quartz.jobStore.misfireThreshold = 60000
3.Misfire的策略
①错过几次让它立刻执行,后面正常调度
②错过的几次让他合并成一次执行,后面正常调度
③忽略错误的次数,正常调度
4.SimpleScheduler怎么使用Mrsfire策略
one
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInSeconds(1) //.WithMisfireHandlingInstructionFireNow() ) .Build(); await scheduler.ScheduleJob(job,trigger);
repeat count
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionIgnoreMisfires() ) .Build(); await scheduler.ScheduleJob(job,trigger);
①WithMisfireHandlingInstructionNextWithExistingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime:22:00开始 重复执行11次 11+11=22点结束
也就是说任然会保留11次执行
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNextWithExistingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
②WithMisfireHandlingInstructionNextWithRemainingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime:22:00开始 重复执行11-4次 ,不管错过的4次,正常调度,7+11=18点结束
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNextWithRemainingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
③WithMisfireHandlingInstructionNowWithExistingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime=Now开始 重复执行11次 10.40+11=21.40结束
也就是说任然会保留11次执行,但是会从现在开始
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNowWithExistingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
④WithMisfireHandlingInstructionNowWithRemainingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime=Now开始 重复执行11-4次 ,不管错过的4次,正常调度,7+10:40=17:40点结束
IScheduler scheduler=await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>().Build(); var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(7,0,0)) .WithSimpleSchedule(s=> s.WithIntervalInHours(1) //.WithMisfireHandlingInstructionFireNow() .WithRepeatCount(10) .WithMisfireHandlingInstructionNowWithRemainingCount() ) .Build(); await scheduler.ScheduleJob(job,trigger);
5.Cronscheduler如何使用Misfire策略
①WithMisfireHandlingInstructionFireAndProceed
错过的合并成一次执行,不修改调度时间
也就说假如StartTime=10:00 现在时间13:16 那么将合并成一次执行
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionFireAndProceed() ) .Build();
②WithMisfireHandlingInstructionIgnoreMisfires
错过的立即追赶,然后正常调度
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionIgnoreMisfires() ) .Build();
③WithMisfireHandlingInstructionDoNothing
错过的不管,正常执行
var trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(10, 0, 0)) .WithCronSchedule("0 0 9-18 ? * MON-FRI", x=>x.WithMisfireHandlingInstructionDoNothing() ) .Build();
微信号:17873041739
微信:17873041739
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?