【问题标题】:Best Practice Way to Embed NREPL in Clojure Server在 Clojure Server 中嵌入 NREPL 的最佳实践方法
【发布时间】:2013-04-19 12:42:32
【问题描述】:

我刚刚开始在 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 服务器”消息。很好。

我查看终端,但没有看到“正在停止...”或“已停止...”消息。相反,我得到以下异常:

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed

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

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

【问题讨论】:

    标签: clojure nrepl


    【解决方案1】:

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

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

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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多