在Clojure服务器中嵌入NREPL的最佳实践方法

jen*_*wan 11 clojure nrepl

我刚开始在Clojure开发服务.我对如何接近服务器关机感到有点迷茫.

我正在使用Clojure 1.5.1.对于日志记录,我使用的是Timbre 1.5.3.我想将NREPL嵌入到我的服务器中以进行热代码部署.

这是我的core.clj文件.核心是我的主要,我正在使用"lein new app"生成的app shell.

(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))
Run Code Online (Sandbox Code Playgroud)

当我"lein run"时,nrepl-server按预期启动,并将信息消息发送到终端.然后我与Emacs的"nrepl"联系.没问题.从Emacs我执行"(extenium.core/stop)".此时,我在Emacs上收到"Stopping nrepl server"消息(意味着stdout被重定向到客户端).连接关闭(如预期的那样),我从未看到"已停止的nrepl服务器"消息.精细.

我看着终端,我没有看到"停止......"或"停止..."的消息.相反,我得到以下异常:

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要以下内容:

  1. 能够从NREPL客户端启动关闭.优雅地关闭所有NREPL客户端连接,无一例外.关闭指向终端的日志消息(或最终,旋转日志文件).
  2. 在NREPL连接期间,将日志记录输出克隆到服务器(终端或日志)和NREPL输出.
  3. 捕获有关传入NREPL连接的信息,命名它们,并记录连接和断开活动.
  4. 最终,验证传入的NREPL连接.
  5. 甚至以后,授权他们执行他们的行动.

noa*_*hlz 2

免责声明:我没有这样做,但看起来很有趣。

根据README,特别是“为什么选择 nREPL?”部分 您应该能够通过实现您自己的自定义传输来实现 2 - 4,也许只是扩展开箱即用的传输之一。

优雅地停止服务器可能需要扩展套接字传输。您所描述的“正常关闭”听起来像是“注销”协议的实现。

授权他们执行的操作似乎不太简单。看起来您需要实现一个自定义处理程序,也许再次default-handler用授权代码包装它。

祝你好运!