Skip to content

Instantly share code, notes, and snippets.

@amoe
Last active November 25, 2016 15:54
Show Gist options
  • Save amoe/39e73d96511f6785b142c4ea006f10bf to your computer and use it in GitHub Desktop.
Save amoe/39e73d96511f6785b142c4ea006f10bf to your computer and use it in GitHub Desktop.
Demo of componentized reloading Rook server usable with 'lein-ring server'
(ns rook-ring-component-test.core
(:require [ring.util.response :as r]
[io.aviso.rook.server :as rserver]
[com.stuartsierra.component :as component]
[clojure.tools.logging :refer [infof]]
[io.aviso.rook :as rook])
(:gen-class))
;; Basic handler
(defn make-rook-handler []
(-> (rook/namespace-handler
["ping" 'rook-ring-component-test.ping])
rook/wrap-with-standard-middleware))
;; Component that wraps the reloading handler
(defrecord RingHandler []
component/Lifecycle
(start [component]
(if-not (:handler component)
(do
(infof "starting: %s" true)
(assoc component :handler
(rserver/construct-handler {:reload true} #'make-rook-handler)))
component))
(stop [component]
(infof "stopping: %s" true)
(assoc component :handler nil)))
(defn new-ring-handler []
(map->RingHandler {}))
;; Development system definition with only 1 component
(defn development-system []
(component/system-map :ring-handler (new-ring-handler)))
(def root-system (development-system))
;; Can be used by 'ring server' to create a non-reloading server
(def my-handler (make-rook-handler))
;; Can be used by 'ring server to create a reloading server
(def my-reloading-handler
(rserver/construct-handler {:reload true} #'make-rook-handler))
;; Can be used by 'ring server' to create a componentized reloading server
(defn my-componentized-handler [request]
;; XXX: Handler must be idempotent.
(alter-var-root #'root-system component/start)
(infof "inside handler")
(let [handler (-> root-system :ring-handler :handler)]
(handler request)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment