-
Notifications
You must be signed in to change notification settings - Fork 0
/
how_to_add_logging.clj
64 lines (51 loc) · 2.89 KB
/
how_to_add_logging.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
(ns example.how-to-add-logging
"Example how to add custom behaviour around components in the registry like
logging or exception handling."
(:require [strojure.fitter.component :as component]
[strojure.fitter.system :as system]))
(set! *warn-on-reflection* true)
;;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
(def ^:private log-info println)
(def ^:private log-error println)
(defn- wrap-component
[[k c]]
[k (component/of
(fn wrapped-start [system]
(log-info "Start" k)
(try (component/start c system)
(catch Throwable e
(log-error "Start" k "-> Exception:" (ex-message e))
(throw e))))
(when-let [stop-fn (component/stop-fn c)]
(fn wrapped-stop! [instance]
(log-info "Stop" k instance)
(try (stop-fn instance)
(catch Throwable e
(println "Stopped" k "-> Exception:" (ex-message e))))))
(when-let [suspend-fn (component/suspend-fn c)]
(fn wrapped-suspend! [instance old-system]
(println "Suspend" k instance)
(when-let [resume-fn (suspend-fn instance old-system)]
(fn wrapped-resume [new-system]
(println "Resume" k)
(resume-fn new-system))))))])
(def ^:private registry
(into {} (map wrap-component)
{:a (component/of (fn [{:keys [b c]}] {:a/inst [b c]})
(fn [inst] {:stopped inst}))
:b (component/of (fn [_] {:b/inst :_})
(fn [inst] {:stopped inst})
(fn [instance _old-system]
(fn resume [_new-system]
(assoc instance :b/resume true))))
:c (component/of (fn [system] {:c/inst (system :b)} #_(throw (Exception. "OOPS")))
(fn [inst] {:stopped inst} #_(throw (Exception. "Failure"))))}))
;;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
(def ^:private system!
(system/init {:registry registry}))
(comment
(system/start! system!)
(system/stop! system! {:suspend true})
(system/stop! system!)
)
;;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••