【发布时间】:2021-08-12 01:45:08
【问题描述】:
TL;DR
如何减少重复代码以下,例如从job-inventory 创建两个作业/触发器,而不是重复两次并创建术语
;; deps in project.clj
;; [clojurewerkz/quartzite "2.1.0"]
(ns hello.scheduler
(: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 :as cron])
(:use clojure.tools.logging)
(:gen-class))
(def job-inventory
[{:name "add" :task '(+ 1 1) :cron "0/5 * * ? * *"}
{:name "multiply" :task '(* 4 5) :cron "0/3 * * ? * *"}])
(defjob add [ctx] (info "add called, return" (+ 1 1)))
(defjob multiply [ctx] (info "multiply called, return" (* 2 3)))
(defn auto
[]
(let [s (-> (qs/initialize) qs/start)
_ (qs/clear! s)
job (j/build
(j/of-type add)
(j/with-identity (j/key "job.add")))
trigger (t/build
(t/with-identity (t/key "trigger.add"))
(t/start-now)
(t/with-schedule (cron/schedule
(cron/cron-schedule "0/5 * * ? * *"))))
_ (qs/schedule s job trigger)
job (j/build
(j/of-type multiply)
(j/with-identity (j/key "job.multiply")))
trigger (t/build
(t/with-identity (t/key "trigger.multiply"))
(t/start-now)
(t/with-schedule (cron/schedule
(cron/cron-schedule "0/3 * * ? * *"))))
_ (qs/schedule s job trigger)
]
))
类似于http://clojurequartz.info/articles/getting_started.html 中描述的内容, 我有代码块来创建作业并将它们挂钩以执行
问题是,当我得到越来越多的它们时,我想知道是否可以有更好的方法来管理它们,比如从 job-inventory 创建/生成,而不是实际创建像 add 或 @987654327 这样的变量@
所以,要求再循环一层 有没有办法利用函数编程,并避免创建新名称(在传统语言中说 python qt,如果我有一组按钮,我可以粉碎成一个巨大的字典,然后循环创建/禁用,而不是实际创建每个命名为顶级变量)
我试过宏,但它说无法解析类添加,所以我猜我用错了
【问题讨论】:
-
您可能希望考虑的相关库:github.com/overtone/at-at
-
@AlanThompson 感谢您的关注,只有三个任务,但在这样的石英术语中,我必须构建一个类型为 job-a 的 job-a 和一个 trigger-a,然后hook up schedule,可以考虑看看他们的教程,这些job之间没有严格的联系或依赖。
-
@AlanThompson 感谢您提供的线索,肯定会看一下,这里我有一个项目已经配置了 cron 格式计划,所以如果兼容会更有吸引力,感谢您的时间:)
-
@AlanThompson 这里的问题可能是,我怎么能在循环中调用
defjob job-a defjob job-b defjob job-c(然后引用它们),一种代码生成技巧。 -
@AlanThompson 嗨艾伦,我已经减少了描述,只显示代码片段,希望它稍微更清楚
标签: functional-programming clojure cron quartzite