4
如果org.quartz.jobStore.misfireThreshold>10s,将会使得cronTrigger的misfire策略变成MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY,而作者期望的是MISFIRE_INSTRUCTION_DO_NOTHING,但是给出的源码中配置默认为60s,那么就会导致被miss的任务重新被执行。@xuxueli
如果org.quartz.jobStore.misfireThreshold>10s,将会使得cronTrigger的misfire策略变成MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY,而作者期望的是MISFIRE_INSTRUCTION_DO_NOTHING,但是给出的源码中配置默认为60s,那么就会导致被miss的任务重新被执行。@xuxueli
你好,关于 misfire 逻辑生效只找到了如下代码:
protected boolean applyMisfire(TriggerWrapper tw) {
long misfireTime = System.currentTimeMillis();
if (getMisfireThreshold() > 0) {
misfireTime -= getMisfireThreshold();
}
Date tnft = tw.trigger.getNextFireTime();
if (tnft == null || tnft.getTime() > misfireTime
|| tw.trigger.getMisfireInstruction() == Trigger.MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY) {
return false;
}
……
}
并没有找到 “misfireThreshold 大于 10s自动切换misfire策略为 MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY ” 的逻辑。 能否提供相关代码或者文档?
不好意思,这里是我的理解有问题。 其实是当区间比较大时,如果停机等,在这个时限内就有可能存在多个触发点,但是这些任务并不是过期的,所以会被正常执行。 比如threshHold=1min,jobA的间隔为10s,那么当停机1小时之后,会在同一时刻连续调度过去1min内的任务。 @xuxueli
这个不会的啊,已经添加了配置 “org.quartz.jobStore.maxMisfiresToHandleAtATime: 1”,任务misfire的情况下只会重试一次的。