【问题标题】:How do I stop jetty server in clojure?如何在 clojure 中停止码头服务器?
【发布时间】:2011-02-11 23:00:32
【问题描述】:

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

【问题讨论】:

    标签: clojure jetty ring


    【解决方案1】:

    Jetty 文档有一些关于 Jetty 的graceful shutdown 的信息。这些信息可能还不够,但可以帮助您入门。

    我还没有开始使用 compojure,但总的来说我更喜欢使用 Tomcat。它功能更全;除其他外,有一个记录良好的 API 用于启动和关闭它,它在专用端口上侦听关闭命令;有ant 任务可以执行此操作,当然也可以从 Java 应用程序调用它们。我只是不知道 Compojure 将 REPL 连接到正在运行的 Web 容器实例有什么魔力,以及是否/如何自动重新加载类......希望其他人能够提供更多信息。

    【讨论】:

    • 好吧,在这种情况下,我什至没有使用 compojure,我只是使用 ring.jetty.adapter 来启动 Jetty 服务器。使用 Jetty 的原因是我不必一直重新编译。
    • 哇,Jetty 让你这么做?凉爽的。将不得不很快了解这一点。谢谢!
    • 此链接已失效。
    【解决方案2】:

    我的 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]。有什么想法吗?
    • 没关系,问题是defonce没有重新定义-想象一下:)
    • 这仍然是最新的吗?我的 repl 中有一个可用的 run-jetty,但是当我使用它时,.start.stop 返回 nil 但什么也不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2014-12-15
    • 2012-02-27
    • 2017-06-14
    相关资源
    最近更新 更多