2016-08-18 3 views
1

次のClojureサンプルプログラムを(boot-cljを使用して)スタンドアロンuberjarにパックすると、java -jar app.jarの実行は、開発repl内から-main関数を呼び出すのとは異なる動作をします。何が起こるuberjar内からのspwaningプロセスの問題

(ns bat-man.core 
    (:require [clojure.java.shell :refer [sh]]) 
    (:gen-class)) 

(defn -main [& args] 
    (prn (sh "echo" "test"))) 

は、結果{:exit 0, :out "test\n", :err ""}stdoutにすぐに印刷されていることですが、その後、プログラムが実際に終了するまでには、時間に沿って多分半分分かかります。
どちらの場合も、プログラムが修正されて、shを呼び出すいくつかの出力を出力するだけの場合です。

開発の中では、すべてが期待どおりで、印刷直後に機能が終了します。どのように説明/修正することができますか?

アップデート:ここでは一方のプログラムが終了するその時間がかかっている取っps auxからの抜粋です:

unsername   8730 5.4 2.0 3643576 80052 pts/8 Sl+ 13:25 0:01 java -jar /path/to/app.jar 

答えて

3

clojure.java.shell/shは舞台裏futureを使用していますので、あなたがシャットダウンバックグラウンドスレッドに(shutdown-agents)を呼び出す必要があります。

+0

このソリューションは機能しますか? IIRC先物とエージェントは異なるスレッドプールを使用します。 – OlegTheCat

+0

同じ動作が続くと思われます。シャットダウンエージェントのドキュメントから役立つかもしれません。「実行中のアクションは完了しますが、新しいアクションは受け入れられません。」 –

+1

@OlegTheCatはい、これはうまくいくはずです。この回答を見る:http://stackoverflow.com/questions/3393497/future-promises-in-clojure-hangs-on-me –

関連する問題