只有一个线程、多个job
第一个job产生misfire(executeTime>Interval) 且是repeatForever 那么只会运行第一个job,后面全部job都没法运行
第一个job产生misfire(executeTime>Interval) 且是withRepeatCount(N),默认状况下(withMisfireHandlingInstructionNowWithExistingCount),第一个job执行完后会执行第二个job;
但若是第二个job对应的trigger设置为:withMisfireHandlingInstructionNextWithExistingCount 或者withMisfireHandlingInstructionNextWithRemainingCount
那么第二个job永远也不会执行,由于Schedule在一开始就计算好了每一个Job的FinalTime(经过调用trigger的getFinalFireTime()方法能够获得),过了这个时间就再也不执行,可是若是开始执行job2时尚未超过它的FinalTime,系统也会执行job2,可是最终
获得的执行次数将小于job2定义的withRepeatCount服务器
N个线程,M个job
若是每一个job都misfire(executeTime>Interval)且都是repeatForever,那么系统只会执行前N个job,后面的job不会执行spa
若是到了执行时间点前一任务还在执行中,可是这时有空闲的线程,那么立刻又会执行,这样一来就会存在同一job被并行执行;不少时候咱们是禁止这样的,为了禁止job在同一时间并行运行,须要在job类上加上标签:.net
@DisallowConcurrentExecution线程
quartz有个全局的参数misfireThreshold设置能够容许的超时时间,超过了就不执行,未超过就执行。
好比设置了misfireThreshold=30分钟,若是一个任务定时在10:30执行,但在10:29服务器挂了,在10:50启动,虽然任务超时了21分钟,但小于misfireThreshold,因此仍是能够执行。而若是服务器11:10才启动,那就misfire了。
对于周期性的任务,若是有misfire的状况出现,则会自动更新CronTrigger的时间周期
默认状况下会在当前时间立刻执行前一个被misfire的任务
而若是设置MISFIRE_INSTRUCTION_DO_NOTHING,则不对misfire的任务作特殊处理,只从当前时间以后的下一次正常调度时间开始执行 orm
产生misfire的前提是:get
到了该触发执行时上一个执行还未完成,且线程池中没有空闲线程可使用(或有空闲线程可使用但job设置为@DisallowConcurrentExecution)且过时时间已经超过misfireThresholdit
知足以上条件就会触发quartz的misfire; 若是产生misfire,quartz有多种处理策略:io
下面是各类不一样triigger对应的不一样misfire策略
CronTrigger线程池
withMisfireHandlingInstructionDoNothing
——不触发当即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行并行
withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间马上开始执行
——重作错过的全部频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
withMisfireHandlingInstructionFireAndProceed(默认)
——以当前时间为触发频率马上触发一次执行
——而后按照Cron频率依次执行
SimpleTrigger
withMisfireHandlingInstructionFireNow
——以当前时间为触发频率当即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得
——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值
withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间马上开始执行
——重作错过的全部频率周期
——当下一次触发频率发生时间大于当前时间之后,按照Interval的依次执行剩下的频率
——共执行RepeatCount+1次
withMisfireHandlingInstructionNextWithExistingCount
——不触发当即执行
——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数
——以startTime为基准计算周期频率,并获得FinalTime
——即便中间出现pause,resume之后保持FinalTime时间不变
withMisfireHandlingInstructionNowWithExistingCount(默认)
——以当前时间为触发频率当即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得
——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值
withMisfireHandlingInstructionNextWithRemainingCount
——不触发当即执行
——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数
——以startTime为基准计算周期频率,并获得FinalTime
——即便中间出现pause,resume之后保持FinalTime时间不变
withMisfireHandlingInstructionNowWithRemainingCount
——以当前时间为触发频率当即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算获得
——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT——此指令致使trigger忘记原始设置的starttime和repeat-count——触发器的repeat-count将被设置为剩余的次数——这样会致使后面没法得到原始设定的starttime和repeat-count值