zoukankan      html  css  js  c++  java
  • Quartz-第三篇 quartz-misfire 错失,补偿执行

    1、问题:使用pauseJob()后,再使用resumeJob()。

       Job如果中间时间足够短,默认会将之前错失的次数执行回来。这个问题的原因是执行调度策略的问题,quartz框架默认会将错失的执行次数补偿回来。

    2、调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则

       misfire产生的条件是:到了该触发执行时上一个执行还未完成,且线程池中没有空闲线程可以使用(或有空闲线程可以使用但job设置为@DisallowConcurrentExecution)且过期时间已经超过misfireThreshold就认为是misfire了,错失触发了。

       比如:13:07:24开始执行,重复执行5次,开始执行时,quartz已经计算好每次调度的时间刻,分别如下:

        03:33:36,03:33:39,03:33:42,03:33:45,03:33:48,03:33:51

      如果第一次执行时间为11s,到03:33:47结束,03:33:47减去03:33:39的时间间隔是8s,如果misfireThreshold设置的时间小于等于8s间隔,则认为是misfire了,如果大于8s间隔,则认为没有misfire。

    对于CronTrigger:
    
    CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
     
    csb.withMisfireHandlingInstructionDoNothing();
    csb.withMisfireHandlingInstructionFireAndProceed();(默认)
    csb.withMisfireHandlingInstructionIgnoreMisfires();
      
    
    withMisfireHandlingInstructionDoNothing
    ——不触发立即执行
    ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
    
    
    withMisfireHandlingInstructionIgnoreMisfires
    ——以错过的第一个频率时间立刻开始执行
    ——重做错过的所有频率周期后
    ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
    
    
    withMisfireHandlingInstructionFireAndProceed(默认)
    ——以当前时间为触发频率立刻触发一次执行
    ——然后按照Cron频率依次执行
    对于SimpleTrigger:
    
    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值

     注:内容参考自https://www.cnblogs.com/skyLogin/p/6927629.html、https://www.cnblogs.com/zhuwenjoyce/p/11184882.html

  • 相关阅读:
    spark on yarn模式下内存资源管理(笔记1)
    面试题10.3-变态跳台阶
    面试题10.2-青蛙跳
    面试题9-斐波那契数列
    面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作
    面试题6:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
    鸢尾花数据集-iris.data
    class之cls
    python 装饰器
    supervisor python开发的进程管理工具
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11494858.html
Copyright © 2011-2022 走看看