只有一个线程、多个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值

转载于:https://blog.51cto.com/tao975/1357210

Quartz的misfire特性相关推荐

  1. Quartz 在misfire模式[错失、补偿执行] 策略

    概述 调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 misfire产生的条件是:到了该触发执行时上一个执行还未完成,且 ...

  2. Quartz.Net—MisFire

    什么是misfire misfire就是哑火,就是trigger没有得到正常的触发. 1.所有的threadpool都在工作,而且工作时间很长,导致trigger没有threadpool去执行. 2. ...

  3. Spring和Quartz实现的定时任务调度

    Corn表达式 一.增加所依赖的JAR包 1. 增加Spring的Maven依赖 [html] view plaincopy <dependency> <groupId>org ...

  4. Quartz任务调度器详解

    关键字: 参考文章:http://blog.sina.com.cn/s/blog_4d36e1ae0100tost.html 价值文章分享:http://wenku.baidu.com/link?ur ...

  5. Quartz 任务调度全攻略

    Quartz是一个开源的任务调度 系统,它能用来调度很多任务的执行. 运行环境•Quartz 能嵌入在其他应用程序里运行. •Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且 ...

  6. Quartz 任务调度全攻略【转】

    Quartz是一个开源的任务调度系统 ,它能用来调度很多任务的执行. 运行环境•Quartz 能嵌入在其他应用程序里运行. •Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且 ...

  7. Quartz配置和运用详解

    本文转自:http://topmanopensource.iteye.com/blog/1123824 最近工作需要学习quartz,那么必须首先了解三个概念: 调度器:负责调度作业和触发器: 触发器 ...

  8. quartz 分布式_后端必备分布式技术之-调度系统Quartz设计原理

    调度系统作为分布式系统技术中重要的一环,了解其技术原理必不可少,不同系统内部采用的调度系统叫法不一样,但大致功能都类似,而Quartz作为经典的开源企业级调度系统,怎么能不研究一下呢? 为什么要学习q ...

  9. Quartz-任务调度概述及Quartz(2.2.X)快速入门

    文章目录 概述 Quartz 概述 Quartz 基础结构 Job JobDetail Trigger Calendar Scheduler ThreadPool 注意 快速入门 Quartz(2.2 ...

  10. Quartz学习资料地址记录 、Quartz 学习的博客地址记录

    Quartz专栏系列 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.Quartz学习--Quartz大致介绍(一) 2.Quartz学习--Q ...

最新文章

  1. async [ə'zɪŋk] 函数
  2. win7任务栏计算机图标,Win7系统任务栏怎么添加显示桌面图标 显示桌面图标如何放到win7任务栏...
  3. PHP保留小数三种方法
  4. __stdcall和__cdecl的区别
  5. 这些令人仰望的C++大咖,都是怎样炼成的?
  6. pandas:数据规范化方法与python实现
  7. [转]深入浅出Java设计模式之备忘录模式
  8. 相机标定(3) opencv中solvePnPRansac()和solvePnP()计算外参数
  9. MySQL内核调试_内核调试技巧
  10. 加载heat resource的代码分析
  11. java实现栈的方法
  12. 挂载Linux镜像文件,使用镜像文件安装依赖
  13. 产品认证之IP防护等级
  14. UEFI开发与调试---运行阶段介绍
  15. 图像金字塔——pyrDown和pyrUp
  16. 3w+字,Python办公自动化之Excel报表自动化,看这一篇就够了!
  17. 数据库字典生成器和使用方式
  18. 数理统计 - 圆环上随机取3个点组成一个锐角三角形的概率
  19. 合并的表格怎么加横线_word
  20. [08]ESP32+激光传感器VL53L1x移植与调试(附源码)

热门文章

  1. Ubuntu开启nfs并连接开发板
  2. 使用.NET Mobile API即51Degrees.mobi检测User-Agent
  3. MMU页表的内存消耗
  4. 【学习】013 Servlet、Cookie、Session的简述
  5. Event Filter Table Entry
  6. php基础-基本语法
  7. Python基础学习1---函数
  8. 包邮送50本数据分析,MySQL,Python相关书籍
  9. 企业组织形态及财务报表
  10. EF 操作数据库中的表