Подтвердить что ты не робот

Лучший способ внедрения NREPL в сервер Clojure

Я только начал разработку службы в 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.
  • Еще позже авторизуйте их для действий, которые они выполняют.
4b9b3361

Ответ 1

Отказ от ответственности: я не сделал этого, но кажется интересным.

В README, в частности раздел "Почему nREPL?" вы должны иметь возможность реализовать 2 - 4 путем реализации собственного пользовательского транспорта, возможно, только расширения одного из готовых.

Прекращение работы сервера изящно может повлечь за собой расширение транспортировки сокетов. То, что вы описываете как "грациозное завершение работы", похоже на реализацию протокола "Выход".

Разрешающие действия, которые они выполняют, кажутся менее простыми. Похоже, вам понадобится реализовать собственный обработчик, возможно, снова обернув default-handler кодом авторизации.

Удачи!