2

我正在使用quartzite,我需要在每个星期二早上(比如上午 10 点)安排一份工作。

我有这份工作的代码,但我不确定如何安排它。

编辑:这是我到目前为止所拥有的,但它不起作用(见评论)。

(defn start-weekly-email-job []
  (let [job  (job/build
              (job/of-type AlertMail)
              (job/with-identity (job/key "jobs.weekly.1")))
        trigger (trigger/build
                 (trigger/with-identity (trigger/key "triggers.1"))
                 (trigger/start-at (time-of-day 10 00 00))
                                        ; at 10 AM, fails with exception
                                        ; IllegalArgumentException No implementation of method: :to-date of protocol: #'clojurewerkz.quartzite.conversion/DateConversion found for class: org.quartz.TimeOfDay  clojure.core/-cache-protocol-fn (core_deftype.clj:554)
                 (trigger/with-schedule (daily/schedule
                                         (daily/on-days-of-the-week #{(int 2)}))))] ;; ;; start Tuesday
    (qs/schedule s job trigger)))

编辑2

使用每日间隔计划 每日间隔计划可以轻松定义计划,例如

  • “周一至周五 9 点至 17 点”
  • “每个周末凌晨三点”
  • “每周五中午”
  • “每天13:45”
  • “星期四每小时,但不迟于 15:00,总共最多 400 次”

我的案例与文档中突出显示的案例非常相似,但我无法找到如何使用每日时间表。

4

1 回答 1

0

一种可行的选择是使用 cron 触发器[1][2][3]。文档 [1] 中的示例代码 -

(ns my.service
  (:require [clojurewerkz.quartzite.scheduler :as qs]
            [clojurewerkz.quartzite.triggers :as t]
            [clojurewerkz.quartzite.jobs :as j]
        [clojurewerkz.quartzite.jobs :refer [defjob]]
            [clojurewerkz.quartzite.schedule.cron :refer [schedule cron-schedule]]))

(defjob NoOpJob
  [ctx]
  (comment "Does nothing"))

(defn -main
  [& m]
  (let [s   (-> (qs/initialize) qs/start)
       job  (j/build
              (j/of-type NoOpJob)
              (j/with-identity (j/key "jobs.noop.1")))
        trigger (t/build
                  (t/with-identity (t/key "triggers.1"))
                  (t/start-now)
                  (t/with-schedule (schedule
                                     (cron-schedule "0 0 15 ? * 5"))))]
  (qs/schedule s job trigger)))

Cron 调度使用调度它的机器的本地时区。类似机器本地时间的0 0 10 ? * TUE描述。every Tuesday at 10am如果时间需要是某个特定的 UTC 时间,那么最好的选择是预先计算相应的本地时间并在 cron 触发器描述中使用它。或者只是将机器配置为使用 UTC 时区。

[1] - http://clojurequartz.info/articles/triggers.html#using_cron_expression_schedules

[2] - [死亡] http://quartz-scheduler.org/generated/2.2.1/html/qs-all/index.html#page/Quartz_Scheduler_Documentation_Set%2Fco-trg_crontriggers.html%23

[3] - http://linux.die.net/man/5/crontab

[4] - 可能替换现在死链接 2 - http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06.html

于 2015-09-17T16:16:42.247 回答