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.

Reply via email to