当今天与星期几匹配时,Quartz 会忽略每日日程安排的时间
Posted
技术标签:
【中文标题】当今天与星期几匹配时,Quartz 会忽略每日日程安排的时间【英文标题】:Quartz ignores time of day for daily schedule when today matches day of week 【发布时间】:2016-06-21 15:39:18 【问题描述】:我正在尝试在一周中的某些日子同时安排每日 Quartz 作业,例如每周二上午 9 点或周二和周三上午 10 点。
当工作日与今天的工作日匹配时,Quartz 的触发时间是意外的。当今天的工作日与计划日期匹配时,触发器按预期在上午 9 点触发 except,在这种情况下,触发器会立即触发,例如如果今天是星期二并且触发器是星期二,那么触发器将在现在触发,而不是在下周上午 9 点触发。 Quartz 为什么要这样做?
我发现防止这种行为的唯一方法是将触发器的开始时间覆盖到第二天,但是如果当前时间早于触发时间,它就会错过当天的触发器,这使得它对我使用 Quartz 作为每日调度器。
注意:我通过Quartzite 使用 Quartz,这是 Quartz 上的一个薄 Clojure 层,但意外行为似乎与 Quartzite 无关。
这是我的触发器构建 Clojure 代码:
(t/build
(t/with-identity (t/key "some-unique-id"))
(t/with-schedule (clojurewerkz.quartzite.schedule.daily-interval/schedule
(on-days-of-the-week (TreeSet. (vec (map #(Integer/valueOf %) [3 4])))) ; Tuesday and Wednesday
(starting-daily-at (daily-interval/time-of-day 09 00 00)))))
【问题讨论】:
【参考方案1】:我认为这可能是您可以使用石英所谓的“失火处理”来处理的情况:http://www.nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html
想象一下,如果进程在您预定的时间内停止/终止并停止运行 - 您可能希望它继续运行并在进程恢复时触发。但是我不清楚您如何区分这种情况(垂死的过程)和您描述的情况(初始调度是在代码部署的当天早些时候......部署?第一次运行?)。
【讨论】:
【参考方案2】:您可以设置 start-now 在这种情况下,如果它已经超过当前时间,它不会考虑触发,但如果它是同一天并且时间尚未到来,它会考虑它。由于您没有通过 start datetime 它认为它在同一天失火并立即解雇它。这应该可以解决您的问题。
(t/build
(t/start-now)
(t/with-identity (t/key "some-unique-id"))
(t/with-schedule (clojurewerkz.quartzite.schedule.daily-interval/schedule
(on-days-of-the-week (TreeSet. (vec (map #(Integer/valueOf %) [3 4])))) ; Tuesday and Wednesday
(starting-daily-at (daily-interval/time-of-day 09 00 00)))))
【讨论】:
以上是关于当今天与星期几匹配时,Quartz 会忽略每日日程安排的时间的主要内容,如果未能解决你的问题,请参考以下文章