检查由环处理程序更新的状态原子

Inspect state atom which gets updated by a ring handler

考虑以下场景:

启动一个 HTTP 服务器的最小引导任务:

(boot (serve :handler 'myapp.server/handler
             :port 3000))

(这可能会以多种方式启动,这里可以从 nrepl 会话 运行 启动,例如从终端 boot repl 启动)

处理程序由命名空间 myapp.server 内的函数 handler 表示。相应的文件如下所示:

(ns myapp.server (:require ...))

(defonce server-state (atom {:nr 0}))

(defn handler [req] 
  (prn (swap! server-state update :nr inc))
  {:body "Answer.\n"})

这有效,每次访问地址 localhost:3000 时,原子都会更新,新版本会打印到 repl 内的标准输出。

如何随时检查原子?

boot.user=> @myapp.server/server-state

产生错误。 (...no such var...)

当在 emacs cider nrepl 连接中尝试同样的事情时,之前的尝试总是显示原子的初始值:{:n 0}


更新

以下是我使用 emacs/cider:

时的具体步骤
  1. cd 项目目录
  2. 开始emacs
  3. cider-jack-in
  4. (boot (dev))
  5. Ctrl+C+C(为了再次得到提示。)
  6. 然后使用 curl 进行测试:获取响应 + 记录内部 emacs 更新的原子:{:n 1} .. {:n 2} ..
  7. 然后,在repl中:(require 'myapp.server),需要一段时间:nil.
  8. 最后:@myapp.server/state --> 但是:{:n 0}

您的 (...no such var...) 错误可能是因为您不需要 myapp.server 命名空间。尝试在 CIDER REPL 中查看原子发生的更新失败可能是因为你的环形应用程序在另一个 JVM 进程中运行而不是你的 REPL,所以 REPL 只看到初始值,因为环形处理程序的更新发生在另一个 JVM 中,或者它包含在一个单独的类加载器中作为它可能被 boot POD.

隔离

您有两个选择:

对于第一种方法,您可能需要使用 boot-clj 的 nrepl option. When you configure it to start nREPL server then you can connect to it using boot repl -c (optionally providing the same coordinates as to boot-http nrepl options) or directly from CIDER 使用 cider-connect