Я пишу веб-приложение, используя кольцо и clojure. Я использую адаптер причала для сервера разработки и emacs/SLIME для IDE. Хотя wrap-reload действительно помогает, run-jetty блокирует мой сеанс slime, и я хотел бы иметь возможность запускать/останавливать его без необходимости запускать его в отдельном сеансе терминала. В идеале я хотел бы определить агента сервера и функции start-server и stop-server, которые начнут/остановят сервер внутри агента. Это возможно?Как остановить сервер причала в clojure?
ответ
я обычно строка в моем приложении Ring, которая выглядит следующим образом:
(defonce server (run-jetty #'my-app {:port 8080 :join? false}))
Это предотвращает блокировку в REPL. Это также позволяет мне перекомпилировать этот файл, не беспокоясь о том, что мой сервер будет переопределен. Она также позволяет взаимодействовать в РЕПЛ так:
user=> (.stop server)
и
user=> (.start server)
Документация Jetty содержит некоторую информацию о graceful shutdown Jetty. Это, вероятно, недостаточно информации, но вы можете начать.
Я еще не начал играть с композицией, но в целом я предпочитаю работать с Tomcat. Это более полнофункциональный; среди прочего, есть хорошо документированный API для его запуска и выключения, он слушает команду shutdown на выделенном порту; есть задачи ant
для этого, и их можно, конечно же, вызвать из приложения Java. Я просто не знаю, какая магия Compojure делает с подключением REPL к работающему экземпляру веб-контейнера, и если/как происходит автоматическая перезагрузка класса ... надеюсь, кто-то еще сможет предоставить дополнительную информацию.
Ну, в данном случае, я даже не используя compojure, я просто с помощью ring.jetty.adapter начать Jetty сервер. Причиной идти с Jetty является то, что мне не нужно перекомпилировать все время. –
Wow, Jetty позволяет это сделать? Круто. Надо будет узнать об этом в скором времени. Благодаря! –
Именно то, что я искал! –
Я получаю эту ошибку: 'Не найдено совпадающего поля: start для класса clojure.lang.PersistentList [Thrown class java.lang.IllegalArgumentException]'. Есть идеи? – Tyler
Ничего, проблема в том, что дефенс не переизбирался - представьте, что :) – Tyler