我正在尝试在一周中的某些日子同时安排每日石英作业,例如每周二上午9点或周二和周三上午10点。
当工作日与今天的工作日相匹配时,石英的开火时间是出乎意料的。当今天的工作日与计划日相匹配时,触发器按照预期在上午9点触发除,在这种情况下,触发器立即触发,例如如果今天是星期二而触发器是星期二,而不是在下周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)))))
答案 0 :(得分:0)
我认为这可能是你可以用石英称之为“失火处理”的情况来处理的:http://www.nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html
想象一下,如果进程发生故障/死亡并且在预定时间内发生故障 - 您可能希望它继续运行并在进程恢复时触发。但是我不清楚你如何区分这种情况(死亡过程)和你描述的情况(初始调度是在代码被部署的那天早些时候?首次运行?)。 / p>
答案 1 :(得分:0)
您可以设置start-now,在这种情况下,如果触发器已经过了当前时间,它就不会考虑触发器,但如果它是同一天并且时间还没有打勾,它会考虑它。由于你没有通过开始日期时间,它认为它在同一天失误并立即开火。这应该可以解决您的问题。
(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)))))