Как остановить сервер причала в clojure?

Я пишу веб-приложение, используя ring и clojure. Я использую адаптер причала для сервера разработки и emacs/SLIME для IDE. Хотя wrap-reload действительно помогает, run-jetty блокирует мой сеанс slime, и я хотел бы иметь возможность запускать/останавливать его без необходимости запускать его в отдельном сеансе терминала. В идеале я хотел бы определить агента сервера и функции start-server и stop-server, которые начнут/остановят сервер внутри агента. Возможно ли это?

Ответ 1

У меня обычно есть строка в моем приложении "Ринг", которая выглядит следующим образом:

(defonce server (run-jetty #'my-app {:port 8080 :join? false}))

Это предотвращает блокировку REPL. Это также позволяет мне перекомпилировать этот файл, не беспокоясь о том, что мой сервер будет переопределен. Он также позволяет вам взаимодействовать с REPL следующим образом:

user=> (.stop server)

и

user=> (.start server)

Ответ 2

В документации Jetty есть информация о изящном завершении Jetty. Это, вероятно, недостаточно информации, но вы можете начать.

Я еще не начинал играть с compojure, но в целом я предпочитаю работать с Tomcat. Это более полнофункциональный; среди прочего, есть хорошо документированный API для его запуска и выключения, он слушает команду shutdown на выделенном порту; для этого есть ant задачи, и их можно, конечно, вызывать из приложения Java. Я просто не знаю, какая магия Compojure делает с подключением REPL к работающему экземпляру веб-контейнера, и если и как происходит автоматическая перезагрузка классов... надеюсь, кто-то еще сможет предоставить дополнительную информацию.