我刚刚开始在Clojure开发服务。我对如何关闭服务器感到迷茫。

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

这是我的core.clj文件。核心是我的主要技能,并且我使用的是“lein new 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))

当我“lein run”时,nrepl-server将按预期方式启动,并且信息消息将发送到终端。然后,我与Emacs的“nrepl”连接。没问题。在Emacs中,我执行“((extenium.core/stop)”。到那时,我在Emacs上收到“正在停止nrepl服务器”消息(这意味着stdout已重定向到客户端)。连接关闭(按预期方式),我再也看不到“Stopped nrepl server”消息。美好的。

我看着终端,但没有看到“Stopping ...”或“Stopped ...”消息。相反,我得到以下异常:
Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed

理想情况下,我需要以下内容:
  • 能够从NREPL客户端启动关闭。正常关闭所有NREPL客户端连接,无一异常(exception)。用定向到终端的日志消息(或最终是循环日志文件)关闭。
  • 在NREPL连接的持续时间内,将日志记录输出克隆到服务器(终端或日志)和NREPL输出。
  • 捕获有关传入NREPL连接的信息,命名它们,并记录连接和断开连接的事件。
  • 最终,对传入的NREPL连接进行身份验证。
  • 甚至以后,请授权他们执行其操作。
  • 最佳答案

    免责声明:我还没有做到这一点,但这似乎很有趣。

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

    温和地停止服务器可能需要扩展套接字传输。您所说的“正常关机”听起来像是“注销”协议(protocol)的实现。

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

    祝你好运!

    关于clojure - 在Clojure服务器中嵌入NREPL的最佳实践方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16104877/

    10-13 08:03