【问题标题】: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 我已经更新了问题

标签: java scheduled-tasks quartz-scheduler quartz.net


【解决方案1】:

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

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

Link to configuration document

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

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

Link to query

【讨论】:

  • 是的,好像是真的!
猜你喜欢
  • 2011-09-02
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2013-05-17
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多