Рассмотрим следующий сценарий:Проверьте состояние атома, который обновляется с помощью кольцевого обработчика
Минимальная задача загрузки запускает 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"})
Это работает, каждый раз, когда адрес локальный: 3000 посетил атом обновляется и новая версия печатается на стандартный вывод внутри REPL.
Как можно проверить атом в любое время?
boot.user=> @myapp.server/server-state
дает ошибку. (...no such var...)
При попытке же самое изнутри соединение nrepl Emacs сидра, это предыдущая попытка всегда показывается начальное значение атома: {:n 0}
UPDATE
Вот точные шаги, которые я выполняю при использовании emacs/сидра:
cd
ProjectDir- начало
emacs
cider-jack-in
(boot (dev))
Ctrl+C+C
- Тогда тестирование с
curl
(для того, чтобы получить приглашение снова.): получать ответы + внутри Emacs обновляется атом регистрируется:{:n 1}
..{:n 2}
.. - Затем в реплике:
(require 'myapp.server)
, занимает время:nil
. - наконец:
@myapp.server/state
-> однако:{:n 0}
Вы уверены, что ваш обработчик звонка и ваш реплика работают в одном и том же процессе JVM? –