Как мне остановить джет сервер в ближайшем будущем?
Я пишу веб-приложение, используя кольцо и clojure. Я использую адаптер Jetty для сервера разработки и emacs/SLIME для IDE. Хотя wrap-reload помогает, run-jetty блокирует мой сеанс слизи, и я хотел бы иметь возможность запускать / останавливать его по своему желанию без необходимости запускать его в отдельном терминальном сеансе. В идеале я хотел бы определить серверный агент и функции start-server и stop-server, которые будут запускать / останавливать сервер внутри агента. Это возможно?
3 ответа
У меня обычно есть строка в приложении Ring, которая выглядит следующим образом:
(defonce server (run-jetty #'my-app {:port 8080 :join? false}))
Это предотвращает блокировку REPL. Это также позволяет мне перекомпилировать этот файл, не беспокоясь о том, что мой сервер будет переопределен. Это также позволяет вам взаимодействовать на REPL следующим образом:
user=> (.stop server)
а также
user=> (.start server)
Документация Jetty содержит некоторую информацию о постепенном отключении Jetty. Это, вероятно, недостаточно информации, но это может помочь вам начать.
Я еще не начал играть с compojure, но в целом я предпочитаю работать с Tomcat. Это более полнофункциональный; среди прочего, есть хорошо документированный API для его запуска и выключения, он слушает команду shutdown на выделенном порту; имеются ant
задачи для этого, и они, конечно, могут быть вызваны из приложения Java. Я просто не знаю, какое волшебство Compojure делает с подключением REPL к работающему экземпляру Web-контейнера, и если / как происходит автоматическая перезагрузка классов... надеюсь, кто-то еще сможет предоставить больше информации.
12 лет спустя.
VSCode/Кальва:
Если вы, как и я, запускаете пристань из repl внутри VSCode / Calva, вам нужно нажать CTRL-C для серверного процесса на терминале, а не для REPL.
На самом деле серверный процесс привязан к терминалу, а не к REPL.