Clojure 如何重新加载(停止和启动)http工具包;“州山”;关于a-主函数

Clojure 如何重新加载(停止和启动)http工具包;“州山”;关于a-主函数,clojure,http-kit,Clojure,Http Kit,使用,如何在-main函数上重新加载(停止和启动)http工具包“mount state” 我目前的代码是: (defstate server-config :start {:port 7890 :join? false}) (defn start-server [server-config] (when-let [server (run-server myserv-ring-handler server-config)] (println "Server has started!"

使用,如何在-main函数上重新加载(停止和启动)http工具包“mount state”

我目前的代码是:

(defstate server-config :start {:port 7890 :join? false})
(defn start-server [server-config]
  (when-let [server (run-server myserv-ring-handler server-config)]
    (println "Server has started!")
    server))

(defstate myserv-server :start (start-server server-config)
          :stop  (myserv-server :timeout 100))

(defn system-port [args]
  (Integer/parseInt
    (or (System/getenv "PORT")
        (first args)
        "7890")))

(defn -main [& args]
  (mount/start-with-states
    {#'myserv/server-config
     {:start #(array-map :port (system-port args)
                         :join? false)}}))
因此,当我“lein run”时,一切都正常,但每当我更改一个文件,http kit服务器停止时,命令就会停止。目前我正在做“while true;do lein run;done”来工作,所以我考虑在-main函数中添加一个无限循环,但感觉这不是正确的方法


我应该怎么做?

我建议向http服务器添加一些元数据
defstate

从mount自述文件:

如果重新加载时不需要对运行状态执行任何操作/ 重新编译/redef,将重新加载时的
:设置为
:noop:

因此,请尝试以下方法:

(defstate ^{:on-reload :noop}
          myserv-server
          :start (start-server server-config)
          :stop  (my-stop-func myserv-server))
这意味着当您更改文件时,受影响的代码将被重新加载,但http服务器将继续运行

我希望我正确理解了你的问题,这就是你想要的


我还建议,如果您想快速启动并运行,那么Leiningen有各种模板化的web应用程序项目。例如,Luminus项目。您可以将
+http kit
参数传递给
lein new luminus myapp
命令,该命令将为您正确连接应用程序。然后,您可以阅读生成的代码,了解它们是如何组合在一起的。

因此,我有两个单独的问题:

  • 我不明白现在我不需要使用leinrun,但是我可以只使用leinrepl并从那里启动服务器。这样就避免了重新启动问题
  • 另一个原因是我滥用了start with states而不是config state

你可以看到与图书馆作者的讨论。

对不起,也许我的问题不太清楚。我确实需要重新启动http工具包,以防路由发生变化;我的问题是,尽管mount状态停止并开始,-main结束,lein run命令停止。我可以在main中添加一个循环,无限期地从状态开始,但对我来说,似乎我正在解决我的问题……下面是一个关于github的问题