Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure服务器中嵌入NREPL的最佳实践方法_Clojure_Nrepl - Fatal编程技术网

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

在Clojure服务器中嵌入NREPL的最佳实践方法,clojure,nrepl,Clojure,Nrepl,我刚刚开始在Clojure中开发一项服务。我对如何关闭服务器有点迷茫 我正在使用Clojure 1.5.1。对于日志记录,我使用的是Timber1.5.3。我想将NREPL嵌入到服务器中以进行热代码部署 这是我的core.clj文件。Core是我的主应用程序,我正在使用“lein new app”生成的应用程序外壳 (ns extenium.core (:require [taoensso.timbre :as t] [clojure.tools.nrepl.serv

我刚刚开始在Clojure中开发一项服务。我对如何关闭服务器有点迷茫

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

这是我的core.clj文件。Core是我的主应用程序,我正在使用“lein new app”生成的应用程序外壳

(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服务器按预期启动,信息消息发送到终端。然后我从Emacs连接到“nrepl”。没问题。从Emacs执行“(extinium.core/stop)”。此时,我在Emacs上收到“stoppingNREPLServer”消息(意味着stdout被重定向到客户端)。连接关闭(如预期的那样),我从未看到“停止nrepl服务器”消息。好的

我看着终端,没有看到“停止…”或“停止…”消息。相反,我得到了以下异常:

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed
理想情况下,我希望:

  • 能够从NREPL客户端启动关机。正常关闭所有NREPL客户端连接,无异常。关闭,日志消息指向终端(或最终指向旋转日志文件)
  • 在NREPL连接期间,将日志输出克隆到服务器(终端或日志)和NREPL输出
  • 捕获有关传入NREPL连接的信息,命名它们,并记录连接和断开连接活动
  • 最后,验证传入的NREPL连接
  • 甚至在以后,授权他们执行操作

  • 免责声明:我没有这样做,但它似乎很有趣

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

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

    授权他们执行的操作似乎不那么简单。看起来您需要实现一个自定义处理程序,可能再次使用授权代码包装
    默认处理程序

    祝你好运