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();