Компонент пьедестала не обновляется после метода запуска

У меня есть приведенный ниже код для моего компонента пьедестала. Когда библиотека Стюарта Сьерры запускает мою системную карту, вызывается метод start, реализованный в derecord пьедестала, и он возвращает обновленную версию моего компонента с ассоциированным :pedestal-server. Разве диспетчер жизненного цикла не должен распространять обновленный компонент, чтобы его можно было использовать методом остановки? Всякий раз, когда я пытаюсь остановить сервер, вызывая (component/stop (system)) в REPL, ничего не происходит, потому что для ключа :pedestal-server установлено значение nil.

(defrecord Pedestal [service-map pedestal-server]
  component/Lifecycle

 (start [this]
  (if pedestal-server
    this
    (assoc this :pedestal-server
                (-> service-map
                    http/create-server
                    http/start))))
 (stop [this]
   (when pedestal-server
     (http/stop pedestal-server))
   (assoc this :pedestal-server nil)))

(defn new-pedestal []
  (map->Pedestal {}))

person Norman Chimpsky    schedule 16.08.2018    source источник


Ответы (1)


Обратите внимание, что при вызове (com.stuartsierra.component/start) для компонента функция возвращает запущенную копию компонента, но не изменяет сам компонент. Аналогичным образом вызов (com.stuartsierra.component/stop) вернет остановленную копию компонента.

Я думаю, что значение ключа :pedestal-server равно нулю, потому что вы не сохранили возвращаемое значение вызова (start), а вызвали его для исходного (незапущенного) компонента.

Вам нужно хранить состояние приложения в каком-то хранилище, например, в атоме или переменной. Затем вы можете обновить состояние хранилища с помощью start и stop.

Например:

;; first we create a new component and store it in system.
(def system (new-pedestal))

;; this function starts the state and saves it:
(defn start-pedestal! [] (alter-var-root #'system component/start))

;; this function stops the running state:
(defn stop-pedestal! [] (alter-var-root #'system component/stop))
person erdos    schedule 16.08.2018
comment
Что ж, хранение состояния в атоме решило мою проблему. Спасибо за чаевые! Хотя пример веб-приложения Стюарта Сьерры не хранит его в изменяемой структуре данных. В его коде экземпляр, возвращаемый веб-платформой, связывается с возвращаемым компонентом в методе запуска и используется методом остановки. Вот пример: github.com/stuartsierra/component - person Norman Chimpsky; 18.08.2018