1

我试图在一周中的某些日子同时安排每日 Quartz 作业,例如每周二上午 9 点或周二和周三上午 10 点。

当工作日与今天的工作日匹配时,Quartz 的触发时间是出乎意料的。触发器按预期在上午 9 点触发,除非今天的工作日与计划日期匹配,在这种情况下触发器会立即触发,例如,如果今天是星期二并且触发器是针对星期二的,而不是在下周上午 9 点触发,触发器将立即触发。为什么石英会这样做?

我发现防止这种行为的唯一方法是将触发器的开始时间覆盖到第二天,但是如果当前时间在触发时间之前,它就会错过当天的触发器,这对我来说毫无意义使用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)))))
4

2 回答 2

0

我认为这可能是你可以用石英所说的“失火处理”来处理的情况:http ://www.nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html

想象一下,如果进程在您预定的时间内停止/死亡并停止运行 - 您可能希望它继续运行并在进程恢复时触发。但是我不清楚您如何区分这种情况(垂死的过程)和您描述的情况(初始调度是在代码部署的当天早些时候......部署?第一次运行?)。

于 2016-06-21T16:22:43.573 回答
0

您可以设置 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)))))
于 2016-08-15T07:54:49.513 回答