Компонент пьедестала не обновляется после запуска
У меня есть код ниже для моего компонента пьедестала. Когда библиотека Стюарта Сьерры запускает мою системную карту, вызывается метод start, реализованный в defdeord Pedestal, и он возвращает обновленную версию моего компонента с:pedestal-server related. Не должен ли менеджер жизненного цикла распространять обновленный компонент, чтобы он мог использоваться методом stop? Всякий раз, когда я пытаюсь остановить сервер с помощью вызова (компонент / остановка (система)) в 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 {}))
1 ответ
Вы должны отметить, что звонки (com.stuartsierra.component/start)
в компоненте функция возвращает начальную копию компонента, но не изменяет сам компонент. Аналогично зовет (com.stuartsierra.component/stop)
вернет остановленную копию компонента.
Я думаю, что ценность :pedestal-server
ключ равен нулю, потому что вы не сохранили возвращенное значение (start)
вызов, но вы вызвали его на исходном (незапущенном) компоненте.
Вы должны хранить состояние приложения в некотором хранилище, например, в Atom или VAR. Затем вы можете обновить состояние хранилища с помощью 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))