Last active
November 25, 2016 15:54
-
-
Save amoe/39e73d96511f6785b142c4ea006f10bf to your computer and use it in GitHub Desktop.
Demo of componentized reloading Rook server usable with 'lein-ring server'
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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