如果触发时间已过,请勿在应用启动时触发触发器。石英

Posted

技术标签:

【中文标题】如果触发时间已过,请勿在应用启动时触发触发器。石英【英文标题】:Do not fire trigger on app startup if trigger time expired. Quartz 【发布时间】:2021-08-10 14:21:14 【问题描述】:

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

我的触发器:

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

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

UPD #1:

当我创建应该在下一分钟开始的简单触发器时,它会重现,之后我关闭所有环境(app + db),然后在触发器应该触发的那一分钟内打开它。检查它:

16:00:00 创建应在 16:01:00 触发的触发器 关闭所有环境 等待 16:01:59 打开电源并观察触发火灾

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

【问题讨论】:

这似乎是我所期望的行为。您是否使用 JDBC 持久化调度程序? @BoristheSpider 是的 @BoristheSpider 我已经更新了问题 【参考方案1】:

石英中有一个属性可以控制失火阈值org.quartz.jobStore.misfireThreshold

在被视为“未触发”之前,调度程序将“容忍”触发器传递其下一次触发时间的毫秒数。默认值(如果您没有在配置中输入此属性)是 60000(60 秒)。

Link to configuration document

我认为如果超过的时间低于 1 分钟(默认值),调度程序仍然认为该作业正在等待正常执行。尝试使用该号码。

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

Link to query

【讨论】:

是的,好像是真的!

以上是关于如果触发时间已过,请勿在应用启动时触发触发器。石英的主要内容,如果未能解决你的问题,请参考以下文章

石英调度程序无法获取触发器

如何为 cron 触发器处理石英夏令时的用户时区?

Quartz Scheduler +HSQLDB 巨大的 .lobs 文件。尺寸永远增加

如何在应用启动期间触发方法? (安卓)

IBM MobileFirst 6.3 在应用程序启动时触发推送事件源回调

在启动时触发BroadcastReceiver的应用程序崩溃