为什么我的 clojure 启动脚本停止 运行
Why does my clojure boot script stop running
我想用 clojure 引导启动一个必须保持 运行ning 的服务器。所以我做了一个 -main
函数,这样我就可以 运行 ./build.boot
并且它将执行主函数。在 main 函数中,我启动了一个非守护线程,只要有一个非守护线程,JVM 就会保持 运行ning。但是启动脚本停止了,我的服务器也停止了。我做错了什么?
#!/usr/bin/env boot
(defn -main [& args]
(let [t (Thread. #(loop []
(println (java.util.Date.))
(Thread/sleep 500)
(recur)))]
(.setDaemon t false)
(.start t)
(Thread/sleep 3000)
(println "I have started a non-daemon thread, but still I exit???")))
输出
#inst "2016-06-23T08:39:23.453-00:00"
#inst "2016-06-23T08:39:24.005-00:00"
#inst "2016-06-23T08:39:24.507-00:00"
#inst "2016-06-23T08:39:25.009-00:00"
#inst "2016-06-23T08:39:25.511-00:00"
#inst "2016-06-23T08:39:26.013-00:00"
I have started a non-daemon thread, but still I exit???
之后脚本结束。
我猜任务完成后引导调用 System/exit
(它们的函数调用结束)。
您需要将您的任务修改为 join
到您的派生线程,以便 -main
函数在您的派生线程尚未完成之前不会完成:
(.join t)
我想用 clojure 引导启动一个必须保持 运行ning 的服务器。所以我做了一个 -main
函数,这样我就可以 运行 ./build.boot
并且它将执行主函数。在 main 函数中,我启动了一个非守护线程,只要有一个非守护线程,JVM 就会保持 运行ning。但是启动脚本停止了,我的服务器也停止了。我做错了什么?
#!/usr/bin/env boot
(defn -main [& args]
(let [t (Thread. #(loop []
(println (java.util.Date.))
(Thread/sleep 500)
(recur)))]
(.setDaemon t false)
(.start t)
(Thread/sleep 3000)
(println "I have started a non-daemon thread, but still I exit???")))
输出
#inst "2016-06-23T08:39:23.453-00:00"
#inst "2016-06-23T08:39:24.005-00:00"
#inst "2016-06-23T08:39:24.507-00:00"
#inst "2016-06-23T08:39:25.009-00:00"
#inst "2016-06-23T08:39:25.511-00:00"
#inst "2016-06-23T08:39:26.013-00:00"
I have started a non-daemon thread, but still I exit???
之后脚本结束。
我猜任务完成后引导调用 System/exit
(它们的函数调用结束)。
您需要将您的任务修改为 join
到您的派生线程,以便 -main
函数在您的派生线程尚未完成之前不会完成:
(.join t)