Best Practice Way to Embed NREPL in Clojure Server
我刚刚开始在Clojure开发服务。我对如何关闭服务器感到迷茫。
我正在使用Clojure 1.5.1。对于日志记录,我使用的是Timbre 1.5.3。我想将NREPL嵌入到服务器中以进行热代码部署。
这是我的core.clj文件。核心是我的主要技能,我使用的是" lein new app"生成的应用程序外壳。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | (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 ..."消息。相反,我得到以下异常:
1 | Exception in thread"nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed |
理想情况下,我需要以下内容:
免责声明:我还没有这样做,但这似乎很有趣。
根据自述文件,特别是"为什么要使用nREPL?"部分 您应该能够通过实现自己的自定义传输来实现2-4,也许仅仅是扩展一种现成的传输。
适当停止服务器可能需要扩展套接字传输。 您所说的"正常关机"听起来像是"注销"协议的实现。
授权他们执行的动作似乎不太简单。 看来您需要实现一个自定义处理程序,也许再次用授权代码包装
祝好运!