Quartz是一个常用的Java定时任务类库,其稳定性达到了工业级别,本文主要阐明其Misfire机制
Quartz的Misfire机制由以下两项决定
- misfireThreshold 参数
- trigger的misfire 策略
接下来详细阐明:
当系统由于某种原因(未启动或是没有可用线程)在预定时刻没有启动任务,之后当系统可以调度该任务时(系统启动或是取得了可用线程),会首先检查当前时刻与预定时刻的差值,如果小于等于misfireThreshold值(该参数缺省为60秒),则不认为发生Misfire,并立刻启动该任务,一切正常进行。
如果大于misfireThreshold值,则认为发生了misfire,此时的行为由trigger的Misfire Instructions来决定。而不同类型的trigger的缺省Misfire Instructions是不同的,具体可以查看trigger的updateAfterMisfire()函数。
对于典型的trigger:
SimpleTrigger 缺省Misfire指令MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT(立即启动,丢失多少次,启动多少次)
CronTrigger 缺省Misfire指令MISFIRE_INSTRUCTION_FIRE_NOW(立即启动,不管丢失多少次,只启动一次)