misfire产生的条件是:到了该触发执行时上一个执行还未完成,且线程池中没有空闲线程可使用(或有空闲线程可使用但job设置为@DisallowConcurrentExecution)且过时时间已经超过misfireThreshold就认为是misfire了,错失触发了java
好比:13:07:24开始执行,重复执行5次,开始执行时,quartz已经计算好每次调度的时间刻,分别以下:负载均衡
03:33:36,03:33:39,03:33:42,03:33:45,03:33:48,03:33:51ui
若是第一次执行时间为11s,到03:33:47结束,03:33:47减去03:33:39的时间间隔是8s,若是misfireThreshold设置的时间小于等于8s间隔,则认为是misfire了,若是大于8s间隔,则认为没有misfire。线程
CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); csb.withMisfireHandlingInstructionDoNothing(); csb.withMisfireHandlingInstructionFireAndProceed();(默认) csb.withMisfireHandlingInstructionIgnoreMisfires();
withMisfireHandlingInstructionDoNothing ——不触发当即执行 ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
withMisfireHandlingInstructionIgnoreMisfires ——以错过的第一个频率时间马上开始执行 ——重作错过的全部频率周期后 ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
withMisfireHandlingInstructionFireAndProceed(默认) ——以当前时间为触发频率马上触发一次执行 ——而后按照Cron频率依次执行
SimpleScheduleBuilder ssb = SimpleScheduleBuilder.simpleSchedule(); ssb.withMisfireHandlingInstructionFireNow(); ssb.withMisfireHandlingInstructionIgnoreMisfires(); ssb.withMisfireHandlingInstructionNextWithExistingCount(); ssb.withMisfireHandlingInstructionNextWithRemainingCount(); ssb.withMisfireHandlingInstructionNowWithExistingCount(); (默认) ssb.withMisfireHandlingInstructionNowWithRemainingCount();
withMisfireHandlingInstructionFireNow ——以当前时间为触发频率当即触发执行 ——执行至FinalTIme的剩余周期次数 ——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得 ——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值
withMisfireHandlingInstructionIgnoreMisfires ——以错过的第一个频率时间马上开始执行 ——重作错过的全部频率周期 ——当下一次触发频率发生时间大于当前时间之后,按照Interval的依次执行剩下的频率 ——共执行RepeatCount+1次
withMisfireHandlingInstructionNextWithExistingCount ——不触发当即执行 ——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数 ——以startTime为基准计算周期频率,并获得FinalTime ——即便中间出现pause,resume之后保持FinalTime时间不变
withMisfireHandlingInstructionNextWithRemainingCount ——不触发当即执行 ——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数 ——以startTime为基准计算周期频率,并获得FinalTime ——即便中间出现pause,resume之后保持FinalTime时间不变
withMisfireHandlingInstructionNowWithExistingCount(默认) ——以当前时间为触发频率当即触发执行 ——执行至FinalTIme的剩余周期次数 ——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得 ——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值
withMisfireHandlingInstructionNowWithRemainingCount ——以当前时间为触发频率当即触发执行 ——执行至FinalTIme的剩余周期次数 ——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得 ——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值 MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT ——此指令致使trigger忘记原始设置的starttime和repeat-count ——触发器的repeat-count将被设置为剩余的次数 ——这样会致使后面没法得到原始设定的starttime和repeat-count值
下面这些缘由可能形成 misfired job:3d
执行流程:blog
misfireHandler线程执行流程以下图所示:事务