Я только начал разработку службы в Clojure. Я немного потерял, как подойти к завершению работы сервера.
Я использую Clojure 1.5.1. Для ведения журнала я использую Timbre 1.5.3. Я хочу встроить NREPL в свой сервер для развертывания горячего кода.
Это мой файл core.clj. Core - мой главный, и я использую оболочку приложения, которая генерирует новое приложение lein.
(ns extenium.core
(:require [taoensso.timbre :as t]
[clojure.tools.nrepl.server :as nrs])
(:gen-class))
(def nrepl-server)
(defn start-nrepl-server []
(t/info "Starting nrepl server on port 8628")
(alter-var-root #'nrepl-server
(constantly
(nrs/start-server :port 8628)))
(t/info "Started nrepl server"))
(defn stop-nrepl-server []
(t/info "Stopping nrepl server")
(nrs/stop-server nrepl-server)
(t/info "Stopped nrepl server"))
(defn start []
(alter-var-root #'*read-eval*
(constantly
false))
(start-nrepl-server))
(defn stop []
(stop-nrepl-server))
(defn -main [& args]
(start))
Когда я запускаю "lein run", nrepl-server запускается, как ожидалось, с информационными сообщениями, идущими в терминал. Затем я соединяюсь с "nrepl" от Emacs. Нет проблем. Из Emacs я выполняю "(extenium.core/stop)". В этот момент я получаю сообщение "Stopping nrepl server" на Emacs (это означает, что stdout был перенаправлен клиенту). Соединение закрывается (как и ожидалось), и я никогда не вижу сообщение "Stopped nrepl server". Хорошо.
Я смотрю на Терминал, и я не вижу сообщения "Остановить..." или "Остановлен...". Вместо этого я получаю следующее исключение:
Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed
В идеале я хочу следующее:
- Чтобы запустить завершение работы с клиентом NREPL. Изящно закрывайте все клиентские соединения NREPL без исключения. Завершение работы с протоколирующими сообщениями, направленными к терминалу (или, в конечном счете, вращающимся файлом журнала).
- В течение времени соединения NREPL клонируйте вывод журнала на сервер (терминал или журнал) и на выход NREPL.
- Захват информации о входящих соединениях NREPL, их имени и подключении к журналу и отключении.
- В конце концов, аутентифицируйте входящие соединения NREPL.
- Еще позже авторизуйте их для действий, которые они выполняют.