我刚刚开始在 Clojure 中开发服务。我对如何处理服务器关闭有点迷茫。
我正在使用 Clojure 1.5.1。对于日志记录,我使用的是 Timbre 1.5.3。我想将 NREPL 嵌入到我的服务器中以进行热代码部署。
这是我的 core.clj 文件。核心是我的主要,我正在使用“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-server 按预期启动,信息消息将发送到终端。然后我从 Emacs 连接“nrepl”。没问题。从 Emacs 我执行“(extenium.core/stop)”。那时,我在 Emacs 上收到“Stopping nrepl server”消息(意味着 stdout 被重定向到客户端)。连接关闭(如预期的那样),我从未看到“已停止的 nrepl 服务器”消息。美好的。
我查看终端,但没有看到“Stopping...”或“Stopped...”消息。相反,我得到以下异常:
Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed
理想情况下,我想要以下内容:
- 能够从 NREPL 客户端启动关闭。优雅地关闭所有 NREPL 客户端连接,无一例外。将日志消息定向到终端(或最终,循环日志文件)关闭。
- 在 NREPL 连接期间,将日志记录输出克隆到服务器(终端或日志)和 NREPL 输出。
- 捕获有关传入 NREPL 连接的信息,为其命名,并记录连接和断开连接活动。
- 最终,验证传入的 NREPL 连接。
- 甚至稍后,授权他们执行他们的操作。