检查由环处理程序更新的状态原子
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:
时的具体步骤
cd
项目目录
- 开始
emacs
cider-jack-in
(boot (dev))
Ctrl+C+C
(为了再次得到提示。)
- 然后使用
curl
进行测试:获取响应 + 记录内部 emacs 更新的原子:{:n 1}
.. {:n 2}
..
- 然后,在repl中:
(require 'myapp.server)
,需要一段时间:nil
.
- 最后:
@myapp.server/state
--> 但是:{:n 0}
您的 (...no such var...)
错误可能是因为您不需要 myapp.server
命名空间。尝试在 CIDER REPL 中查看原子发生的更新失败可能是因为你的环形应用程序在另一个 JVM 进程中运行而不是你的 REPL,所以 REPL 只看到初始值,因为环形处理程序的更新发生在另一个 JVM 中,或者它包含在一个单独的类加载器中作为它可能被 boot POD.
隔离
您有两个选择:
在启用 REPL 服务器的情况下启动你的环形应用程序,并从另一个进程连接到它 (for example by using Server Socket REPL and connecting to it using telnet)
启动您的 REPL,然后从中启动您的环形应用程序,您就可以访问所有已加载的命名空间。
对于第一种方法,您可能需要使用 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
。
考虑以下场景:
启动一个 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:
时的具体步骤cd
项目目录- 开始
emacs
cider-jack-in
(boot (dev))
Ctrl+C+C
(为了再次得到提示。)- 然后使用
curl
进行测试:获取响应 + 记录内部 emacs 更新的原子:{:n 1}
..{:n 2}
.. - 然后,在repl中:
(require 'myapp.server)
,需要一段时间:nil
. - 最后:
@myapp.server/state
--> 但是:{:n 0}
您的 (...no such var...)
错误可能是因为您不需要 myapp.server
命名空间。尝试在 CIDER REPL 中查看原子发生的更新失败可能是因为你的环形应用程序在另一个 JVM 进程中运行而不是你的 REPL,所以 REPL 只看到初始值,因为环形处理程序的更新发生在另一个 JVM 中,或者它包含在一个单独的类加载器中作为它可能被 boot POD.
您有两个选择:
在启用 REPL 服务器的情况下启动你的环形应用程序,并从另一个进程连接到它 (for example by using Server Socket REPL and connecting to it using telnet)
启动您的 REPL,然后从中启动您的环形应用程序,您就可以访问所有已加载的命名空间。
对于第一种方法,您可能需要使用 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
。