forked from michaelklishin/quartzite
/
jobs.clj
77 lines (58 loc) · 1.64 KB
/
jobs.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(ns clojurewerkz.quartzite.jobs
(:refer-clojure :exclude [key])
(:import [org.quartz Job JobDetail JobBuilder JobKey JobExecutionContext JobDataMap]
[org.quartz.utils Key]
[clojure.lang IPersistentMap])
(:use [clojurewerkz.quartzite.conversion :only [to-job-data]]))
;;
;; Implementation
;;
;; ...
;;
;; API
;;
(defn ^JobKey key
([]
(JobKey. (Key/createUniqueName nil)))
([named]
(JobKey. (name named)))
([named, group]
(JobKey. (name named) (name group))))
(defn ^JobBuilder with-identity
([^JobBuilder jb s]
(if (instance? JobKey s)
(.withIdentity jb ^JobKey s)
(.withIdentity jb (key s))))
([^JobBuilder jb s group]
(.withIdentity jb (key s group))))
(defn ^JobBuilder with-description
[^JobBuilder jb ^String s]
(.withDescription jb s))
(defn ^JobBuilder store-durably
[^JobBuilder jb]
(.storeDurably jb))
(defn ^JobBuilder request-recovery
[^JobBuilder jb]
(.requestRecovery jb))
(defn ^JobBuilder of-type
[^JobBuilder jb clazz]
(.ofType jb clazz))
(defn ^JobBuilder using-job-data
[^JobBuilder tb m]
(.usingJobData tb (to-job-data m)))
(defn ^JobDetail finalize
[^JobBuilder jb]
(.build jb))
(defmacro ^JobDetail build
[& body]
`(let [jb# (JobBuilder/newJob)]
(finalize (-> jb# ~@body))))
;; This macro is necessary because clojure.core/proxy and clojure.core/reify
;; do not work for this specific use case with Quartz. See https://groups.google.com/forum/#!topic/clojure/WIIcvsYLzh0
;; for the discussion. MK.
(defmacro defjob
[jtype args & body]
`(defrecord ~jtype []
org.quartz.Job
(execute [this ~@args]
~@body)))