我正在使用ring和clojure编写Web应用程序。我正在使用jetty适配器作为开发服务器,使用emacs / SLIME作为IDE。虽然wrap-reload确实有帮助,但run-jetty会阻塞我的slime会话,我想随时能够启动/停止它,而不必在单独的终端会话中运行它。理想情况下,我想定义一个服务器代理和函数start-server和stop-server,以在代理内部启动/停止服务器。这个可能吗?
我通常在我的Ring应用程序中有一个如下所示的行:
(defonce server (run-jetty #'my-app {:port 8080 :join? false}))
这可以防止REPL锁定。它还允许我重新编译此文件而不必担心我的服务器将被重新定义。它还可以让您像以下方式在REPL中进行交互:
user=> (.stop server)
并且
user=> (.start server)
Jetty文档中有一些关于优雅关闭Jetty的信息。这可能不足够,但可以让您开始。
我还没有开始使用compojure,但总体上我更喜欢使用Tomcat。它更全面; 其中之一是有一个经过充分记录的API来启动和关闭它,它在专用端口上侦听关闭命令; 有ant
任务来执行此操作,当然也可以从Java应用程序中调用它们。我只是不知道Compojure如何通过连接REPL到正在运行的Web容器实例以及自动类重载发生了什么样的魔法...希望其他人能够提供更多信息。
12年后。
VSCode / Calva:
如果你和我一样在VSCode / Calva中从repl启动jetty,那么你必须通过终端而不是REPL来使用CTRL-C关闭服务器进程。
实际上,服务器进程绑定到终端而不是REPL。
No matching field found: start for class clojure.lang.PersistentList [Thrown class java.lang.IllegalArgumentException]
。有什么想法吗? - Tylerrun-jetty
,但是当我使用它时,.start
或.stop
返回nil
但什么也不做。 - Matt:join?false
防止线程锁定直到服务器停止(默认为true
) - svitanok