quartz 触发器未到时间就执行

在创建触发器的时候,有一个属性叫开始时间,在开始时间到当前系统之间有可能会存在可能会触发的时间却并没有被触发,这属于丢失的触发Misfired。quartz对于这样的触发有两种处理方式MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:针对 misfired job 马上执行一次;
MISFIRE_INSTRUCTION_DO_NOTHING:忽略 misfired job,等待下次触发;程序默认为第一种。所以会出现多执行一次的现象。将此值设为第二种即可解决这个现象。

在此我们不得不强调一下quartz中的MisFired.
在 Quartz 应用中,misfired job 是经常遇到的情况。一般来说,下面这些原因可能造成 misfired job:
1)系统因为某些原因被重启。在系统关闭到重新启动之间的一段时间里,可能有些任务会
被 misfire;
2)Trigger 被暂停(suspend)的一段时间里,有些任务可能会被 misfire;
3)线程池中所有线程都被占用,导致任务无法被触发执行,造成 misfire;
4)有状态任务在下次触发时间到达时,上次执行还没有结束;
为了处理 misfired job,Quartz 中为 trigger 定义了处理策略,主要有下面两种:
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:针对 misfired job 马上执行一次;(默认)
MISFIRE_INSTRUCTION_DO_NOTHING:忽略 misfired job,等待下次触发;

提醒一个quartz.properties中的一个配置项
org.quartz.jobStore.misfireThreshold
默认为1分钟。

你可能感兴趣的:(quartz)