vue 做企业网站行不,wordpress简单,建设网站的技术难点,微信公众号电商网站开发一. 简介
1. 什么是哑火 由于某些原因导致触发器(trigger)在该触发的时候没有得到触发,后续对应的解决策略即为哑火策略。(个人理解)
2. 哑火触发的条件 ①#xff1a;所有的工作线程都在忙碌#xff0c;导致某些trigger得不到触发.(如#xff1a;simplethreadpool 默认是…一. 简介
1. 什么是哑火 由于某些原因导致触发器(trigger)在该触发的时候没有得到触发,后续对应的解决策略即为哑火策略。(个人理解)
2. 哑火触发的条件 ①所有的工作线程都在忙碌导致某些trigger得不到触发.(如simplethreadpool 默认是10个工作线程但我有15个trigger同时触发 恰巧这10个trigger关联的job耗时都很长剩下的5个trigger超过了等待时间仍然没有得到触发) ②调度器(sheduler)中途挂了某个时间又恢复了 ③设置的trigger的开始时间早于当前时间 如果没有触发哑火的条件则不会触发哑火策略之前的全部都是按照忽略来计算的后续按照正常规律来进行。如果不设置开始时间即为当前时间开始不触发哑火策略。 下面介绍两类Trigger对应的哑火策略SimpleTrigger和CronTrigger 前提案例设置时间早于当前时间的即都是有错过的 二. SimpleTrigger哑火策略详解 这里要分三种情况来讨论执行指定次数的情况WithRepeatCount(n)n1、n1、nforever三种情况重点理解n1的情况另外两种都是他的特殊情况而已。
(一)执行指定次数的情况WithRepeatCount(n) n1 只要记住这种情况下面的B和C都能分析出来
(1).默认 立即执行修改当前调度时间总数保持不变 等价于WithMisfireHandlingInstructionNowWithExistingCount 详见下面解析
(2).WithMisfireHandlingInstructionIgnoreMisfires错过的立即追赶然后正常调度。 PS设置的时间早于当前时间执行的时候会将当前时间之前错过的次数一次性执行完然后正常按照设置的开始时间及规律进行执行。 如果设置的RepeatCount(n)中n的次数小于错过的次数只能执行n次执行完后将不会在执行了因为执行次数已经用完了。 案例设置的开始时间为800每隔半小时执行一次执行总次数为5次当前时间为9:05那么开始时候会先执行3次将错过的一次性执行了然后按照正常调度执行下一次执行的时间为9:30还能执行两次。
(3).WithMisfireHandlingInstructionNextWithExistingCount错过的不管了按计划等待下次调度总数不变结束时间推迟。 PS错过的次数不处理仍按照设置的规律来执行执行次数不变要执行完的RepeatCount(n)中的n. 案例设置的开始时间为800每隔半小时执行一次执行总次数为5次当前时间为9:05那么开始时候并没有调度执行第一次执行调度的时间为9:30然后按照正常调度执行总共执行5次最后一次时间为11:30。
(4).WithMisfireHandlingInstructionNextWithRemainingCount错过的不管了按计划等待下次调度但总数要减去misfire错过的次数 PS错过的次数不处理仍按照设置的规律来执行执行总数要 减去 错过的次数 案例设置的开始时间为800每隔半小时执行一次执行总次数为5次当前时间为9:05那么开始时候并没有调度执行第一次执行调度的时间为9:30然后按照正常调度执行总共执行 5-32 次最后一次时间为10:00。
(5).WithMisfireHandlingInstructionNowWithExistingCount: 立即执行修改当前调度时间总数保持不变 PS立即执行修改当前调度时间的含义为即使我设置的开始时间早于当前时间但该哑火策略会立马执行该触发器即运行后马上执行了一次后续的时间间隔均是是以当前执行时间为基础来进行的言外之意之前设置的开始时间没用了执行总数不变。 案例设置的开始时间为800每隔半小时执行一次执行总次数为5次当前时间为9:05那么开始时候立即执行第一次执行调度的时间为9:05然后以9:05为基础按照正常调度规律执行总共执行5次第二次时间为9:35最后一次执行时间为11:05。
(6).WithMisfireHandlingInstructionNowWithRemainingCount: 立即执行修改当前调度时间总数要减去misfire错过的次数 PS立即执行修改当前调度时间的含义为即使我设置的开始时间早于当前时间但该哑火策略会立马执行该触发器即运行后马上执行了一次后续的时间间隔均是是以当前执行时间为基础来进行的言外之意之前设置的开始时间没用了。执行总数要 减去 错过的次数 案例设置的开始时间为800每隔半小时执行一次执行总次数为5次当前时间为9:05那么开始时候立即执行第一次执行调度的时间为9:05然后以9:05为基础按照正常调度规律执行总共执行 5-32 次第二次即最后一次时间为9:35。
B只执行一次的情况 WithRepeatCount(n) n1 对A情况的一个特殊分析
(1). 默认(等价于WithMisfireHandlingInstructionFireNow)
(2). WithMisfireHandlingInstructionFireNow:立即执行 PS设置的时间早于当前时间执行的时候立即把这一次执行完后续将不再执行但设置的时间晚于当前时间则按照正常规律进行执行了
(3).WithMisfireHandlingInstructionNextWithRemainingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount 不执行了 PS设置的时间早于当前时间执行的时候按照原规律执行但是次数要减去错过的次数这里总共就执行一次所以就不执行了 C永久执行的情况RepeatForever 对A情况的一个特殊分析
(1). 默认等价与下面的(2)按计划的正常调度执行执行次数永久执行
(2). WithMisfireHandlingInstructionNextWithExistingCount 和 WithMisfireHandlingInstructionNextWithRemainingCount按计划的正常调度执行执行次数永久执行
(3). WithMisfireHandlingInstructionNowWithExistingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount 立即执行执行的开始时间改为当前时间执行次数永久执行
代码分享自行替换即可 1 public static void misfireShow()2 {3 //1.创建Schedule4 IScheduler scheduler StdSchedulerFactory.GetDefaultScheduler();5 //2.创建job (具体的job需要单独在一个文件中执行)6 var job JobBuilder.CreateHelloJob4().Build();7 //3.配置trigger 8 //下面的四个触发器对应了上面四种情况的测试时间需要根据实际情况进行配置测试来设置9 var trigger1 TriggerBuilder.Create().StartAt(DateBuilder.DateOf(20, 0, 0))
10 .WithSimpleSchedule(x x.WithIntervalInMinutes(30)
11 .WithRepeatCount(8)
12 .WithMisfireHandlingInstructionNowWithExistingCount()
13 ).Build();
14 var trigger2 TriggerBuilder.Create().StartAt(DateBuilder.DateOf(18, 0, 0))
15 .WithSimpleSchedule(x x.WithIntervalInSeconds(1)
16 .WithRepeatCount(1)
17 .WithMisfireHandlingInstructionFireNow()
18 ).Build();
19 var trigger3 TriggerBuilder.Create()
20 .StartAt(DateBuilder.DateOf(15, 0, 0, 5, 3, 2018))
21 .WithSimpleSchedule(x x.WithIntervalInMinutes(1)
22 .WithMisfireHandlingInstructionNowWithRemainingCount()
23 .RepeatForever()).Build();
24 var trigger4 TriggerBuilder.Create()
25 .StartAt(DateBuilder.DateOf(14, 0, 0))
26 .WithCronSchedule(0 0-59 9-23 ? * MON-FRI,xx.WithMisfireHandlingInstructionIgnoreMisfires()).Build();
27
28 //4.开始调度
29 scheduler.ScheduleJob(job, trigger1);
30 scheduler.Start();
31 } 三. CronTrigger哑火策略详解
(1). 默认错过的合并,于当前时间执行一次不修改调度时间按计划等待下一次调度等价于下面的 WithMisfireHandlingInstructionFireAndProceed
(2). WithMisfireHandlingInstructionIgnoreMisfires错过的立即追赶然后正常调度 ps错过多少次初次执行的时候追赶多少次追赶的次数的时间是按原规律执行的时间然后按照原规律进行正常后续调度
(3). WithMisfireHandlingInstructionFireAndProceed错过的合并,于当前时间执行一次不修改调度时间按计划等待下一次调度 PS无论错过多少次均在初次运行的时候即当前时间执行一次后续的执行仍按照原规律进行执行。
(4). WithMisfireHandlingInstructionDoNothing错过的不管了后续按照正常调度进行 PS无论错过多少次均忽略后续的执行仍按照原规律进行执行。 代码详见上面的代码分享