[xuxueli/xxl-job]misfireThreshold这个配置可能会导致misfire策略失效,导致任务重复触发。

2024-05-15 25 views
9

如果org.quartz.jobStore.misfireThreshold>10s,将会使得cronTrigger的misfire策略变成MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY,而作者期望的是MISFIRE_INSTRUCTION_DO_NOTHING,但是给出的源码中配置默认为60s,那么就会导致被miss的任务重新被执行。@xuxueli

回答

8

你好,关于 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 ” 的逻辑。 能否提供相关代码或者文档?

0

不好意思,这里是我的理解有问题。 其实是当区间比较大时,如果停机等,在这个时限内就有可能存在多个触发点,但是这些任务并不是过期的,所以会被正常执行。 比如threshHold=1min,jobA的间隔为10s,那么当停机1小时之后,会在同一时刻连续调度过去1min内的任务。 @xuxueli

5

这个不会的啊,已经添加了配置 “org.quartz.jobStore.maxMisfiresToHandleAtATime: 1”,任务misfire的情况下只会重试一次的。