0

マウント ライブラリを使用して、-main 関数で http-kit の「マウント状態」をリロード (停止および開始) するにはどうすればよいですか?

私の現在のコードはこれです:

(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 関数に無限ループを入れようかとも思ったのですが、これではだめな気がします。

どうすればいいですか?

4

2 に答える 2

0

http サーバーにメタデータを追加することをお勧めしますdefstate

マウントの readme から:

リロード/再コンパイル/再定義時に何も実行状態にする必要がない場合は、 に設定:on-reload:noop:ます。

だから、次のようなことを試してください:

(defstate ^{:on-reload :noop}
          myserv-server
          :start (start-server server-config)
          :stop  (my-stop-func myserv-server))

つまり、ファイルを変更すると、影響を受けるコードがリロードされますが、http サーバーは引き続き実行されます。

私はあなたの質問を正しく理解し、これがあなたが望んでいたものであることを願っています.

また、すぐに立ち上げて実行したい場合は、ライニンゲン向けのさまざまなテンプレート化された Web アプリ プロジェクトがあることをお勧めします。たとえば、Luminus プロジェクト。+http-kitコマンドにパラメーターを渡すことができlein new luminus myappます。これにより、アプリが正しく接続されます。次に、生成されたコードを読んで、すべてがどのように適合するかを学びます。

于 2016-12-23T14:54:55.063 に答える