Quartz的misfire特性

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

Quartz的misfire特性的更多相关文章

  1. Quartz的misfire处理机制分析

    Quartz是一个特性丰富的开源的任务调度开发库,它可以很方便的集成到你的应用程序中.在Quartz中,当一个持久的触发器因为调度器被关闭或者线程池中没有可用的线程而错过了激活时间时,就会发生激活失败 ...

  2. Quartz的misfire理解

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

  3. Quartz.net misfire实践

      1.问题描述 在使用Quartz.net定时运行作业时,存在一种情况:作业错过了某次执行,当作业恢复的时候应该怎么处理?如:job1在3:50的时候应该执行的,但此刻job1处于暂停状态,而到3: ...

  4. Quartz.Net—MisFire

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

  5. Quartz.Net—IJob特性

    IJob默认情况下是无状态的,和其他系统没有关系  特别是job里面的jobdata每次都是新的.可以无限扩展. PersistJobDataAfterExecution JobData持久化 Job ...

  6. Quartz任务调度:MisFire策略和源码分析

    Quartz是为大家熟知的任务调度框架,先看看官网的介绍: ---------------------------------------------------------------------- ...

  7. [Quartz笔记]玩转定时调度

    简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...

  8. (5)Quartz学习

    原文:http://blog.csdn.net/zxl315/article/details/10879927 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行. 运 ...

  9. quartz.net 学习

    目录 简介  Quartz是什么?  Quartz的应用场景Quartz的安装  安装  源码Hello World范例API  核心API    Scheduler接口:    Job接口    J ...

随机推荐

  1. Python-Day9 Paramiko模块/进程/线程/RabbitMQ队列

    一.Paramiko模块 1.Paramiko安装 Python的目录下有个Scripts目录,cd到这个目录用这里面的pip命令(如果添加的环境变量可以在cmd直接输入命令):pip install ...

  2. PAT IO-02 整数四则运算

    /* *PAT IO-02 整数四则运算 *2015-07-30 *作者:flx413 */ #include<stdio.h> int main() { int a, b; scanf( ...

  3. 表达式语言之ongl表达式

    OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...

  4. mac安装cocoapods

    sudo gem install cocoapods

  5. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

  6. entityframwork

    entityframwork映射部分: public class NorthwindContext : DbContext { public DbSet<CATEGORIES> Categ ...

  7. 敏捷开发之道(三)极限编程XP续

    上次的博文敏捷开发之道(二)极限编程XP中,我们了解了XP的实践中的其中四个,今天我们来一起学习一下剩余的实践. --接上文 5).结对编程 结对编程就是由结对的开发人员使用同一台电脑共同完成一项任务 ...

  8. 初解DLL基本知识

    1.DLL基本理论 在Windows操作系统中,几乎所有的内容都是以DLL的形式存在的. 1.DLL基本概念 语言程序要从目标代码(.obj)外部引用函数,可以通过俩种途径实现——静态链接和动态链接. ...

  9. ffmpeg 打开视频流太慢(上)

    新版ffmpeg打开网络视频流需要调用avformat_find_stream_info方法,很多朋友会发现调用改方法耗费很多时间造成打开视频流太慢.有两个参数可以减少avformat_find_st ...

  10. 用MSBuild和Jenkins搭建持续集成环境 - 转

    http://www.infoq.com/cn/articles/MSBuild-1 http://www.infoq.com/cn/articles/MSBuild-2 MSBuild是在.NET ...