0

2 つの Jar ファイルを持つ Java アプリケーションを作成しました。Jar1 は、次のコードを使用して、Jar2 を初期化および実行するために使用されます。

Process process = runtime.exec( "java -jar Jar2.jar" );
printLogs( process );
.
.
.
private static boolean printLogs( Process process ) {
    try {
        BufferedInputStream logStream = new BufferedInputStream( process.getInputStream() );
        String logs = "";
        int buffer = 0;

        while ( ( buffer = logStream.read() ) != -1 ) {
            logs += (char)buffer;
        }

        if( !logs.isEmpty() ) logger.debug( logs );
    } catch (IOException e) {}  

    return true;
}

Log4Jを使用してJar2から多くのログを出力します。

logger.debug( "..." );

しかし、Jar2 のログはどれもコンソールに出力されませんでした。ログがコンソールではなくJar1に返されるためだとわかったので、上記のコードを使用して返されるストリームを出力しました。ログは正常に出力されるようになりましたが、すべての Jar2 プロセスが終了した後、Jar1 ですべてのログが一度に出力されます。

問題は、Jar2 のすべてのプロセスが終了するのを待つ代わりに、Jar2 の各ログ行を時間内に出力できますか?

Jar2 は長いプロセスであるため、アプリケーションの処理中にこれらのログを確認できることが重要です。

4

3 に答える 3

2

全体がかなりめちゃくちゃです。2つの別々のアーカイブは必要ありません。Runtime.exec()

ただし、通常はBufferedReader.readLinesテキスト行を読み取るために使用します。読んだ瞬間に各行をログに記録すると、問題は単純に消えることに注意してください。

BufferedReader input = new BufferedReader(
  new InputStreamReader(process.getInputStream())
);
String line = null;

while ((line = input.readLine()) != null) {
  System.out.println(line);
}

ストリームが終了した後(つまり、サブプロセスが終了した後)に行をログに記録したため、コードは子プロセスが完了するまで待機します

これは、監視対象のプロセスとして長時間実行されるRubyプログラムを使用するデモプログラムです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Subprocess {

    static final String[] program = new String[] {
        "ruby",
        "-e" ,
        "(1..5).each{|i|sleep 1;puts i;STDOUT.flush}"
    };

    public static void main(String[] args) throws IOException {
        ProcessBuilder builder = new ProcessBuilder(program);
        builder.redirectErrorStream();

        Process child = builder.start();

        String line = null;
        BufferedReader in = new BufferedReader(
                new InputStreamReader(child.getInputStream()));

        while ((line = in.readLine()) != null)
            System.out.println(line);
    }

}
于 2012-09-18T12:33:08.580 に答える
0

コードは、実際にログを書き込む前ににlogStream到達するのを待っているようです(これはプロセスの終了時に発生します)。EOFリファクタリングして文字ごとに読み取り、改行が表示されるたびに蓄積された文字バッファーをログに記録してみてください(EOFもちろん、最後の行を取得します)。

于 2012-09-18T12:24:31.217 に答える
0

この投稿の助けを借りて、私はこれを修正することができました:

system.in の読み取り時に Runtime.exec が返されない

ProcessBuilderも使用しました。

于 2012-09-22T17:15:12.053 に答える