make refresh watcher/worker threads stoppable (and restartable)
This commit is contained in:
parent
5fdc6334bb
commit
f9c15d6cd6
|
@ -136,10 +136,11 @@
|
||||||
[last-update min-refresh-interval]
|
[last-update min-refresh-interval]
|
||||||
(Thread/sleep (max 0 (- min-refresh-interval (- (System/currentTimeMillis) last-update)))))
|
(Thread/sleep (max 0 (- min-refresh-interval (- (System/currentTimeMillis) last-update)))))
|
||||||
|
|
||||||
(defn worker-thread
|
(defn refresh-worker-thread
|
||||||
"Handles refresh requests."
|
"Handles refresh requests."
|
||||||
[view-system]
|
[view-system]
|
||||||
(fn []
|
(fn []
|
||||||
|
(try
|
||||||
(when-let [[namespace view-id parameters :as view-sig] (.poll ^ArrayBlockingQueue refresh-queue 60 TimeUnit/SECONDS)]
|
(when-let [[namespace view-id parameters :as view-sig] (.poll ^ArrayBlockingQueue refresh-queue 60 TimeUnit/SECONDS)]
|
||||||
(when (collect-stats?) (swap! statistics update-in [:refreshes] inc))
|
(when (collect-stats?) (swap! statistics update-in [:refreshes] inc))
|
||||||
(try
|
(try
|
||||||
|
@ -153,20 +154,59 @@
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(error "error refreshing:" namespace view-id parameters
|
(error "error refreshing:" namespace view-id parameters
|
||||||
"e:" e "msg:" (.getMessage e)))))
|
"e:" e "msg:" (.getMessage e)))))
|
||||||
(recur)))
|
(catch InterruptedException e))
|
||||||
|
(if-not (:stop-workers? @view-system)
|
||||||
|
(recur)
|
||||||
|
(debug "exiting worker thread"))))
|
||||||
|
|
||||||
(defn update-watcher!
|
(defn refresh-watcher-thread
|
||||||
"A single threaded view update mechanism."
|
[view-system min-refresh-interval]
|
||||||
[view-system min-refresh-interval threads]
|
(fn []
|
||||||
(swap! view-system assoc :last-update 0)
|
(let [last-update (:last-update @view-system)]
|
||||||
(.start (Thread. (fn [] (let [last-update (:last-update @view-system)]
|
|
||||||
(try
|
(try
|
||||||
(if (can-refresh? last-update min-refresh-interval)
|
(if (can-refresh? last-update min-refresh-interval)
|
||||||
(refresh-views! view-system)
|
(refresh-views! view-system)
|
||||||
(wait last-update min-refresh-interval))
|
(wait last-update min-refresh-interval))
|
||||||
(catch Exception e (error "exception in views e:" e "msg:"(.getMessage e))))
|
(catch InterruptedException e)
|
||||||
(recur)))))
|
(catch Exception e
|
||||||
(dotimes [i threads] (.start (Thread. ^Runnable (worker-thread view-system)))))
|
(error "exception in views e:" e "msg:" (.getMessage e))))
|
||||||
|
(if-not (:stop-refresh-watcher? @view-system)
|
||||||
|
(recur)
|
||||||
|
(debug "exiting refresh watcher thread")))))
|
||||||
|
|
||||||
|
(defn start-update-watcher!
|
||||||
|
"Starts threads for the views refresh watcher and worker threads that handle
|
||||||
|
view refresh requests."
|
||||||
|
[view-system min-refresh-interval threads]
|
||||||
|
(if (and (:refresh-watcher @view-system)
|
||||||
|
(:workers @view-system))
|
||||||
|
(error "cannot start new watcher and worker threads until existing threads are stopped")
|
||||||
|
(let [refresh-watcher (Thread. ^Runnable (refresh-watcher-thread view-system min-refresh-interval))
|
||||||
|
worker-threads (mapv (fn [_] (Thread. ^Runnable (refresh-worker-thread view-system)))
|
||||||
|
(range threads))]
|
||||||
|
(swap! view-system assoc
|
||||||
|
:last-update 0
|
||||||
|
:refresh-watcher refresh-watcher
|
||||||
|
:stop-refresh-watcher? false
|
||||||
|
:workers worker-threads
|
||||||
|
:stop-workers? false)
|
||||||
|
(.start refresh-watcher)
|
||||||
|
(doseq [^Thread t worker-threads]
|
||||||
|
(.start t)))))
|
||||||
|
|
||||||
|
(defn stop-update-watcher!
|
||||||
|
"Stops threads for the views refresh watcher and worker threads."
|
||||||
|
[view-system]
|
||||||
|
(swap! view-system assoc
|
||||||
|
:stop-refresh-watcher? true
|
||||||
|
:stop-workers? true)
|
||||||
|
(if-let [^Thread refresh-watcher (:refresh-watcher @view-system)]
|
||||||
|
(.interrupt refresh-watcher))
|
||||||
|
(doseq [^Thread worker-thread (:workers @view-system)]
|
||||||
|
(.interrupt worker-thread))
|
||||||
|
(swap! view-system assoc
|
||||||
|
:refresh-watcher nil
|
||||||
|
:workers nil))
|
||||||
|
|
||||||
(defn log-statistics!
|
(defn log-statistics!
|
||||||
"Run a thread that logs statistics every msecs."
|
"Run a thread that logs statistics every msecs."
|
||||||
|
|
Loading…
Reference in a new issue