我尝试创建一个类似于Quartzite defjob宏的宏,该宏创建了添加了@DisallowConcurrentExecution注释的Job类。代码从repl开始,但不在宏内部。
这有效......
user=> (defrecord ^{DisallowConcurrentExecution true} YYY []
#_=> org.quartz.Job
#_=> (execute [this context]
#_=> (println "whoosh!")))
user.YYY
user=> (seq (.getAnnotations YYY))
(#<$Proxy3 @org.quartz.DisallowConcurrentExecution()>)
......但事实并非如此。
(defmacro defncjob
[jtype args & body]
`(defrecord ^{DisallowConcurrentExecution true} ~jtype []
org.quartz.Job
(execute [this ~@args]
~@body)))
在罗德里戈的建议之后,这是一种让它发挥作用的方法。
(defmacro defdcejob
[jtype args & body]
`(defrecord ~(vary-meta jtype assoc `DisallowConcurrentExecution true) []
org.quartz.Job
(execute [this ~@args]
~@body)))