I do the following in my code (where system/http is a mount var, the eval result of start-server):
(ns ... (:require [aleph.netty :as netty]) (defn -main [& args] (mount/start args) (netty/wait-for-close server/http)) On Wednesday, June 8, 2016 at 7:53:25 AM UTC-7, Nate Young wrote: > > Good morning (at least from my part of the globe), > > I spent a good chunk of time last night wondering why this chunk of code > kept exiting about a minute after being run: > > ---------------------------------------- > (ns narcoleptic.server > (:require [aleph.http :as http] > [compojure.core :as compojure :refer [GET]] > [compojure.route :as route] > [ring.middleware.params :as params])) > > (def handler > (params/wrap-params > (compojure/routes > (GET "/" [] "Hello World!") > (route/not-found "Not Found")))) > > (def server (agent nil)) > > (defn -main [] > (send-off server #(or % (http/start-server handler {:port 9000})))) > ---------------------------------------- > > until I found > http://tech.puredanger.com/2010/06/08/clojure-agent-thread-pools/ which > explains that send-off pools die after a minute. Additionally, it looks > like all of the thread pools that aleph creates are marked as daemon > threads, so the main thread dies after the send-off, the send-off thread > dies after a minute and that leaves no non-daemon threads running, so > the JVM exits. Cool. > > My question, then, is this: Is there a best practice for keeping a > thread open forever so that my server won't ever exit? I'd like to `lein > run -m narcoleptic.server` and see that it stays up as long as possible. > > I've tried two solutions, but the first feels ike an awful lot of typing > for a language that usually has the right tools close at hand and the > second feels like a hack and doesn't play as nicely in a REPL > environment (but they both work): > > (1) > ---------------------------------------- > (defn wait-until-stopped [] > (let [stopped (promise)] > (add-watch server :stop-wait > (fn [key server old-state new-state] > (when (= new-state :stopped) > (remove-watch server :stop-wait) > (deliver stopped :ok)))) > @stopped)) > ---------------------------------------- > > (2) > ---------------------------------------- > ;; removed the agents code > (def stopped (promise)) > (defn -main [] > (http/start-server handler {:port 9000}) > @stopped) > ---------------------------------------- > > Am I super off in the woods here? Any help/pointers/sage advice > appreciated. Thanks! > > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.