Почему мой загрузочный скрипт clojure перестает работать

Я хочу запустить сервер с Clojure Boot, который должен продолжать работать. Итак, я сделал -main функционировать так, чтобы я мог бежать ./build.boot и это будет выполнять основную функцию. В основной функции я запускаю поток, не являющийся демоном, с мыслью, что JVM продолжает работать, пока существует поток, не являющийся демоном. Однако скрипт загрузки останавливается и мой сервер тоже останавливается. Что я делаю неправильно?

#!/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???

После чего сценарий заканчивается.

1 ответ

Решение

Я думаю, загрузочные вызовы System/exit как только задачи выполнены (их вызов функции заканчивается).

Вы должны изменить свою задачу на join к вашей порожденной нити, так что -main функция не завершается, пока ваша порожденная нить не завершится:

(.join t)

Другие вопросы по тегам