Skip to content

Instantly share code, notes, and snippets.

@tolitius
Last active November 1, 2016 18:25
Show Gist options
  • Save tolitius/0d33c7b8788334556b76118d91e81042 to your computer and use it in GitHub Desktop.
Save tolitius/0d33c7b8788334556b76118d91e81042 to your computer and use it in GitHub Desktop.
restart on zoo / consul / etc .. config changes
(ns cchange
(:require [mount.core :as mount]))
(defprotocol ChangeListener
(add-watcher [this ks watcher])
(on-change [this k]))
(deftype RestartListener [watchers]
ChangeListener
(add-watcher [_ ks state]
(doseq [k ks]
(swap! watchers update k #(conj % state))))
(on-change [_ k]
(let [states (@watchers k)]
(apply mount/stop states)
(apply mount/start states))))
(def +version+ "0.0.1")
(set-env!
:source-paths #{"."}
:dependencies
'[[mount "0.1.11-SNAPSHOT"]])
$ boot repl
nREPL server started on port 49856 on host 127.0.0.1 - nrepl://127.0.0.1:49856
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.7.0
boot.user=> (require '[mount.core :as mount :refer [defstate]]
                     '[cchange :as c])

boot.user=> (import '[cchange RestartListener])
cchange.RestartListener
boot.user=> (defstate a :start (println "starting a") :stop (println "stopping a"))
"|| mounting... #'boot.user/a"
#'boot.user/a
boot.user=> (defstate b :start (println "starting b") :stop (println "stopping b"))
"|| mounting... #'boot.user/b"
#'boot.user/b
boot.user=> (defstate c :start (println "starting c") :stop (println "stopping c"))
"|| mounting... #'boot.user/c"
#'boot.user/c
boot.user=> (defstate zoo :start (RestartListener. (atom {})))
"|| mounting... #'boot.user/zoo"
#'boot.user/zoo

boot.user=> (mount/start #'boot.user/zoo)
{:started ["#'boot.user/zoo"]}
boot.user=> (c/add-watcher zoo #{:foo :bar} #'boot.user/a)
boot.user=> (c/add-watcher zoo #{:baz :bam} #'boot.user/b)
boot.user=> (c/add-watcher zoo #{:baz :woo :moo} #'boot.user/c)

Rock & Roll

boot.user=> (c/on-change zoo :foo)
starting a
{:started ["#'boot.user/a"]}

boot.user=> (c/on-change zoo :foo)
stopping a
starting a
{:started ["#'boot.user/a"]}

boot.user=> (c/on-change zoo :bar)
stopping a
starting a
{:started ["#'boot.user/a"]}
boot.user=> (c/on-change zoo :woo)
starting c
{:started ["#'boot.user/c"]}

boot.user=> (c/on-change zoo :woo)
stopping c
starting c
{:started ["#'boot.user/c"]}

boot.user=> (c/on-change zoo :moo)
stopping c
starting c
{:started ["#'boot.user/c"]}

boot.user=> (c/on-change zoo :baz)
stopping c
starting b
starting c
{:started ["#'boot.user/b" "#'boot.user/c"]}

boot.user=> (c/on-change zoo :baz)
stopping c
stopping b
starting b
starting c
{:started ["#'boot.user/b" "#'boot.user/c"]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment