Clojure 如何重新加载(停止和启动)http工具包;“州山”;关于a-主函数
使用,如何在-main函数上重新加载(停止和启动)http工具包“mount state” 我目前的代码是: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!"
(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的问题