当今天与星期几匹配时,Quartz会忽略每日时间表的时间

时间:2016-06-21 15:39:18

标签: clojure quartz-scheduler

我正在尝试在一周中的某些日子同时安排每日石英作业,例如每周二上午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)))))

2 个答案:

答案 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)))))