Skip to content

Instantly share code, notes, and snippets.

@kidpollo
Created March 29, 2014 06:37
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kidpollo/9849655 to your computer and use it in GitHub Desktop.
Save kidpollo/9849655 to your computer and use it in GitHub Desktop.
Example compojure app using stuartsierra/component
(ns app.api-server
(:require [compojure.core :as compojure]
[com.stuartsierra.component :as component]
[app.app :as app]
[ring.adapter.jetty :as jetty]))
(compojure/defroutes app
app/handler)
(defrecord AppServer [port server]
component/Lifecycle
(start [component]
(println ";; Starting App server")
(let [server (jetty/run-jetty app {:port port :join? false})]
(assoc component :server server)))
(stop [component]
(println ";; Stopping App server")
(.stop server)
component))
(defn app-server
[port]
(map->AppServer {:port port}))
(ns app.app
"Entry point for app"
(:require [compojure.handler]
[compojure.core :as compojure]
[ring.util.response :as resppnse]
[compojure.route :as route]))
(compojure/defroutes app-routes
(compojure/GET "/" [] "<h1>Hello World</h1>")
(route/not-found "<h1>Page not found</h1>"))
; for Api development
(def handler
(-> app-routes
compojure.handler/api))
; for Web Page development
;(def handler
; (-> app-routes
; compojure.handler/site))
(ns app.core
(:gen-class)
(:require [app.system :as system]
[com.stuartsierra.component :as component]))
(defn -main [& args]
(let [[app-port] args]
(component/start
(system/app-system {:app-port app-port}))))
(defproject app "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]
[ring "1.2.2"]
[compojure "1.1.6"]
[com.stuartsierra/component "0.2.1"]])
(ns app.system
(:require [app.app-server :as app-server]
[com.stuartsierra.component :as component]))
(def app-system-components [:app])
(defrecord AppSystem [config-options app]
component/Lifecycle
(start [this]
(component/start-system this app-system-components))
(stop [this]
(component/stop-system this app-system-components)))
(defn app-system [config-options]
(let [{:keys [app-port]} config-options]
(map->AppSystem
{:config-options config-options
:app (app-server/app-server app-port)})))
(ns app.user
"Tools for interactive development with the REPL. This file should
not be included in a production build of the application."
(:require
[clojure.java.io :as io]
[clojure.java.javadoc :refer (javadoc)]
[clojure.pprint :refer (pprint)]
[clojure.reflect :refer (reflect)]
[clojure.repl :refer (apropos dir doc find-doc pst source)]
[clojure.set :as set]
[clojure.string :as str]
[clojure.test :as test]
[clojure.tools.namespace.repl :refer (refresh refresh-all)]
[com.stuartsierra.component :as component]
[app.system :refer :all]))
(def system nil)
(defn init []
(alter-var-root #'system
(constantly (app-system {:app-port 9000}))))
(defn start []
(alter-var-root #'system component/start))
(defn stop []
(alter-var-root #'system
(fn [s] (when s (component/stop s)))))
(defn go []
(init)
(start))
(defn reset []
(stop)
(refresh :after 'user/go))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment