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