/
poller.clj
38 lines (34 loc) · 1.39 KB
/
poller.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
(ns stavka.updaters.poller
(:require [stavka.protocols :as sp])
(:import [java.util.concurrent Executors ThreadFactory TimeUnit]))
(def stavka-poller-thread-factory
(let [prefix "stavka-poller-thread-"
counter (atom -1)]
(reify ThreadFactory
(newThread [this r]
(doto (Thread. r)
(.setName (str prefix (swap! counter inc)))
(.setDaemon true))))))
(defonce poller-pool
(delay (Executors/newScheduledThreadPool 8 stavka-poller-thread-factory)))
(defrecord PollingUpdater [interval-ms state reload-fn]
sp/Updater
(start! [this]
(let [future (.scheduleWithFixedDelay @poller-pool
(cast Runnable (fn []
(try
(reload-fn)
(catch Throwable _))))
interval-ms
interval-ms
TimeUnit/MILLISECONDS)]
(swap! (.-state this) assoc :future future)))
(stop! [this]
(when-let [future (:future @(.-state this))]
(.cancel future true))))
(defn poll
"Updater configuration by polling source at given interval"
[source interval]
[source
(fn [reload-fn]
(PollingUpdater. interval (atom {}) reload-fn))])