如何在Clojure中停止Jetty服务器?

64

我正在使用ring和clojure编写Web应用程序。我正在使用jetty适配器作为开发服务器,使用emacs / SLIME作为IDE。虽然wrap-reload确实有帮助,但run-jetty会阻塞我的slime会话,我想随时能够启动/停止它,而不必在单独的终端会话中运行它。理想情况下,我想定义一个服务器代理和函数start-server和stop-server,以在代理内部启动/停止服务器。这个可能吗?

3个回答

123

我通常在我的Ring应用程序中有一个如下所示的行:

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

这可以防止REPL锁定。它还允许我重新编译此文件而不必担心我的服务器将被重新定义。它还可以让您像以下方式在REPL中进行交互:

user=> (.stop server)

并且

user=> (.start server)

我遇到了这个错误:No matching field found: start for class clojure.lang.PersistentList [Thrown class java.lang.IllegalArgumentException]。有什么想法吗? - Tyler
3
没关系,问题在于defonce没有被重新定义 - 想象一下 :) - Tyler
这还有效吗?我在我的REPL中有一个工作的run-jetty,但是当我使用它时,.start.stop返回nil但什么也不做。 - Matt
2022年:这个运行良好。 - jgomo3
只是为了澄清一下:是:join?false防止线程锁定直到服务器停止(默认为true - svitanok

1

Jetty文档中有一些关于优雅关闭Jetty的信息。这可能不足够,但可以让您开始。

我还没有开始使用compojure,但总体上我更喜欢使用Tomcat。它更全面; 其中之一是有一个经过充分记录的API来启动和关闭它,它在专用端口上侦听关闭命令; 有ant任务来执行此操作,当然也可以从Java应用程序中调用它们。我只是不知道Compojure如何通过连接REPL到正在运行的Web容器实例以及自动类重载发生了什么样的魔法...希望其他人能够提供更多信息。


1
好的,在这种情况下,我甚至没有使用compojure,我只是使用ring.jetty.adapter来启动Jetty服务器。选择Jetty的原因是为了不必一直重新编译。 - Mad Wombat
1
哇,Jetty可以做到这个?太酷了。我得尽快学习一下。谢谢! - Carl Smotricz
3
该链接已失效。 - bfontaine

1

12年后。

VSCode / Calva:

如果你和我一样在VSCode / Calva中从repl启动jetty,那么你必须通过终端而不是REPL来使用CTRL-C关闭服务器进程。

实际上,服务器进程绑定到终端而不是REPL。


12年后。我的问题特别提到了emacs,没有提到vscode。虽然说实话,自从我上次接触emacs、clojure或jetty以来已经很长时间了。 - Mad Wombat
哈哈太棒了..我在搜索如何在vscode中停止jetty进程时偶然发现了你的帖子。虽然我已经像上面的评论中提到的那样使用了join,但我无法通过ctrl-c退出该进程。愚蠢的我没有意识到可以从vscode的终端中杀死该进程。由于所有服务器启动消息都出现在repl中,因此它似乎只在其中运行。不过你可能对这些都不感兴趣 :) - simou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接