clojurecup2015-mailhead/src/mailhead/core.clj

65 lines
1.7 KiB
Clojure

(ns mailhead.core
(:require [mailhead.handler :refer [app init destroy]]
[immutant.web :as immutant]
[clojure.tools.nrepl.server :as nrepl]
[taoensso.timbre :as timbre]
[environ.core :refer [env]])
(:gen-class))
(defonce nrepl-server (atom nil))
(defn parse-port [port]
(when port
(cond
(string? port) (Integer/parseInt port)
(number? port) port
:else (throw (Exception. (str "invalid port value: " port))))))
(defn stop-nrepl []
(when-let [server @nrepl-server]
(nrepl/stop-server server)))
(defn start-nrepl
"Start a network repl for debugging when the :nrepl-port is set in the environment."
[]
(if @nrepl-server
(timbre/error "nREPL is already running!")
(when-let [port (env :nrepl-port)]
(try
(->> port
(parse-port)
(nrepl/start-server :port)
(reset! nrepl-server))
(timbre/info "nREPL server started on port" port)
(catch Throwable t
(timbre/error t "failed to start nREPL"))))))
(defn http-port [port]
(parse-port (or port (env :port) 3000)))
(defonce http-server (atom nil))
(defn start-http-server [port]
(init)
(reset! http-server (immutant/run app :host "0.0.0.0" :port port)))
(defn stop-http-server []
(when @http-server
(destroy)
(immutant/stop @http-server)
(reset! http-server nil)))
(defn stop-app []
(stop-nrepl)
(stop-http-server)
(shutdown-agents))
(defn start-app [[port]]
(.addShutdownHook (Runtime/getRuntime) (Thread. stop-app))
(start-nrepl)
(start-http-server (http-port port))
(timbre/info "server started on port:" (:port @http-server)))
(defn -main [& args]
(start-app args))