• Quartz的misfire理解


    misfire用于Trigger触发时,线程池中没有可用的线程或者调度器关闭了,此时这个Trigger变为misfire。当下次调度器启动或者有可以线程时,会检查处于misfire状态的Trigger。而misfire的状态值决定了调度器如何处理这个Trigger。


    最好的文档是官方文档。


    以下转自http://blog.sina.com.cn/s/blog_56d8ea900101eu45.html


    只有一个线程、多个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不会执行

    如果到了执行时间点前一任务还在执行中,但是这时有空闲的线程,那么马上又会执行,这样一来就会存在同一job被并行执行;很多时候我们是禁止这样的,为了禁止job在同一时间并行运行,需要在job类上加上标签:

    @DisallowConcurrentExecution


    quartz有个全局的参数misfireThreshold设置可以允许的超时时间,超过了就不执行,未超过就执行。
    比如设置了misfireThreshold=30分钟,如果一个任务定时在10:30执行,但在10:29服务器挂了,在10:50启动,虽然任务超时了21分钟,但小于misfireThreshold,所以还是可以执行。而如果服务器11:10才启动,那就misfire了。

    对于周期性的任务,如果有misfire的情况出现,则会自动更新CronTrigger的时间周期
    默认情况下会在当前时间马上执行前一个被misfire的任务
    而如果设置MISFIRE_INSTRUCTION_DO_NOTHING,则不对misfire的任务做特殊处理,只从当前时间之后的下一次正常调度时间开始执行

    产生misfire的前提是:

    到了该触发执行时上一个执行还未完成,且线程池中没有空闲线程可以使用(或有空闲线程可以使用但job设置为@DisallowConcurrentExecution)且过期时间已经超过misfireThreshold

    满足以上条件就会触发quartz的misfire; 如果产生misfire,quartz有多种处理策略:

    下面是各种不同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值

    http://blog.sina.com.cn/s/blog_613904cc0101gajk.html
    http://my.oschina.net/chenleijava/blog/109904

    good:http://hedatou.com/archives/introduction_to_quartz.html
    上面的状态和quartz-1.8.4 不符:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/:
    cron状态:
    MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:就是MISFIRE_INSTRUCTION_SMART_POLICY
    MISFIRE_INSTRUCTION_DO_NOTHING
    simple状态,MISFIRE_INSTRUCTION_SMART_POLICY依据不同的repeatCount会有不同的对应结果:
    MISFIRE_INSTRUCTION_FIRE_NOW:
    MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:
    MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:
  • 相关阅读:
    jQuery中获取元素的属性方法attr()简单用法
    【经验】angularjs 实现带查找筛选功能的select下拉框
    【经验】Angularjs 中使用 layDate 日期控件
    在 VPS 上一键安装KMS服务脚本
    Windows 使用 TCPing 工具来获取 TCP延迟、端口通顺情况、已禁Ping服务器的延迟
    Linux 初级教程:初步进入 Linux 世界
    Debian/Ubuntu TCP拥塞控制技术 ——TCP-BBR 一键安装脚本
    Linux 下 iptables 配置详解
    在 Ubuntu 上安装 LaTeX
    代码审计学习之反射型XSS
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710145.html
Copyright © 2020-2023  润新知