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

У меня есть код ниже для моего компонента пьедестала. Когда библиотека Стюарта Сьерры запускает мою системную карту, вызывается метод 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))
Другие вопросы по тегам