如果触发时间已过,请勿在应用启动时触发触发器。石英
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
【讨论】:
是的,好像是真的!以上是关于如果触发时间已过,请勿在应用启动时触发触发器。石英的主要内容,如果未能解决你的问题,请参考以下文章
Quartz Scheduler +HSQLDB 巨大的 .lobs 文件。尺寸永远增加