检查由环处理程序

时间:2016-08-12 18:57:42

标签: emacs clojure ring cider

请考虑以下情形:

最小启动任务启动http服务器:

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

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

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

(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内的stdout。

如何在任何时候检查原子?

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

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

当在emacs cider nrepl连接中尝试相同的事情时,此前一次尝试始终显示原子的初始值:{:n 0}

更新

以下是使用emacs / cider时的确切步骤:

  1. cd projectdir
  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}

1 个答案:

答案 0 :(得分:0)

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

您有两种选择:

使用第一种方法,您可能需要使用boot-clj的nrepl选项。当您将其配置为启动nREPL服务器时,您可以使用boot repl -c(可选地提供与boot-http nrepl选项相同的坐标)或directly from CIDER使用cider-connect连接到它。