如果触发时间到期,请不要在应用程序启动时触发触发器。石英

Do not fire trigger on app startup if trigger time expired. Quartz

我有一个简单的触发器可以触发一个简单的工作(假设 - 发送电子邮件)。

我的触发器:

return newTrigger()
            .withIdentity(name, group)
            .withSchedule(
                simpleSchedule()
                    .withMisfireHandlingInstructionNextWithExistingCount()
            )
            .startAt(triggerStartTime)
            .usingJobData(JobDataMap(triggerData))
            .withDescription(description)
            .build()

但是,假设服务在 triggerStartTime 触发时间不可用(我刚刚关闭了数据库和我的服务)。一段时间后,当我再次 运行 我的服务时 - 在日志中我看到触发器已执行。

UPD #1:

当我创建应该在下一分钟启动的简单触发器时,它会重现,之后我关闭所有环境(应用程序+数据库),然后在触发器应该触发的那一刻将其打开。检查一下:

但如果我在 16:02:00 之后打开所有环境,它就不会触发。这是非常奇怪的行为。另外,我观察到,在这种情况下,触发器没有从数据库中删除。

quartz中有一个属性来控制失火阈值org.quartz.jobStore.misfireThreshold

The number of milliseconds the scheduler will 'tolerate' a trigger to pass its next-fire-time by, before being considered "misfired". The default value (if you don’t make an entry of this property in your configuration) is 60000 (60 seconds).

Link to configuration document

我认为如果超过的时间低于1分钟(默认值),调度程序仍然认为作业正在等待正常执行。尝试玩那个数字。

这是为获取要执行的触发器而触发的实际查询,注意下面查询中的第二个条件是基于 misfireThreshold 属性

Link to query