2013-04-19 12 views
11

Clojureでサービスの開発を開始しました。私はサーバーのシャットダウンに近づく方法が少し失われています。ClojureサーバにNREPLを組み込むベストプラクティス

私はClojure 1.5.1を使用しています。ロギングでは、Timbre 1.5.3を使用しています。私はホットコードの展開のために私のサーバーにNREPLを埋め込みたいと思っています。

これは私のcore.cljファイルです。コアが私のメインで、私は "lein new app"が生成するアプリケーションシェルを使用しています。

(ns extenium.core 
    (:require [taoensso.timbre :as t] 
      [clojure.tools.nrepl.server :as nrs]) 
    (:gen-class)) 

(def nrepl-server) 

(defn start-nrepl-server [] 
    (t/info "Starting nrepl server on port 8628") 
    (alter-var-root #'nrepl-server 
        (constantly 
        (nrs/start-server :port 8628))) 
    (t/info "Started nrepl server")) 

(defn stop-nrepl-server [] 
    (t/info "Stopping nrepl server") 
    (nrs/stop-server nrepl-server) 
    (t/info "Stopped nrepl server")) 

(defn start [] 
    (alter-var-root #'*read-eval* 
        (constantly 
        false)) 
    (start-nrepl-server)) 

(defn stop [] 
    (stop-nrepl-server)) 

(defn -main [& args] 
    (start)) 

nilpl-serverは、nrepl-serverが期待どおりに起動すると、情報メッセージがターミナルに送られます。私はEmacsの "nrepl"と接続します。問題ない。 Emacsから私は "(extenium.core/stop)"を実行します。その時点で、私はEmacs(stdoutがクライアントにリダイレクトされたことを意味する)で "nreplサーバーを停止しています"というメッセージが表示されます。接続は(期待どおり)終了し、「停止したnreplサーバー」メッセージは表示されません。ファイン。

端末を見ると、「停止中...」または「停止...」というメッセージは表示されません。

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed 

は、理想的には、私は次のようほしい:

  1. がNREPLクライアントからのシャットダウンを開始することができるようにする代わりに、私は次の例外を取得します。例外なくすべてのNREPLクライアント接続を正常に閉じます。ターミナルに向かうロギングメッセージ(または最終的には回転ログファイル)でシャットダウンします。
  2. NREPL接続の間、ログ出力をサーバー(端末またはログ)とNREPL出力の両方にクローンします。
  3. 着信NREPL接続に関する情報をキャプチャし、名前を付け、ログの接続および切断アクティビティをログに記録します。
  4. 最終的に、着信NREPL接続を認証します。
  5. さらに、実行する操作のためにそれらを承認します。

答えて

2

免責事項:私はこれをしていないが、面白いと思われる。

READMEには、特に「nREPLを使用する理由」のセクションがあります。独自のカスタムトランスポートを実装することで2 - 4を実装することができます。

サーバーを正常に停止すると、ソケットトランスポートが拡張されることがあります。 「グレースフルシャットダウン」とは、「ログアウト」プロトコルの実装のようなものです。

彼らが実行する認証アクションはあまり簡単ではありません。おそらくdefault-handlerを再度承認コードでラップするカスタムハンドラを実装する必要があるようです。

幸運を祈る!

関連する問題