1

ProcessBuilderとの違いを説明してくださいFileHandler。どの状況でどちらを使用する必要がありますか。

たとえば、コマンドの出力を「logfile.txt」などのテキスト ファイルにリダイレクトする場合ProcessBuilder、ファイルに出力を取得するのに数秒かかります。

FileHandler100 個のプロセスが出力を同じ「logfile.txt 」に送信する必要があるような状況で、これは何ができるでしょうか?

のメソッドを使用せずに、100 レコードすべての出力を同じ「logfile.txt 」に取得する方法はありますか? これは私のコードですが、100 レコードが同時にスケジュールされている場合、p.waitfor() メソッドは役に立ちません。コマンドを実行してすべてのプロセスのログファイルに出力を取得するのに数秒かかり、100 プロセスの場合はさらに時間がかかるためです。 DB 内のすべてのレコードに対して同じコマンドを実行する時間。しかし、私のアプリケーションは毎分開始されます。それが問題です。 process.waitFor() は正確な出力を得るのに役立ちますが、レコードの数が多いほど時間がかかります。待つべきではないが、すべての出力を同期的にファイルに追加する必要がある別の方法が必要です。process.waitFor()ProcessBuilder

while(rs1.next())
    {
        instance_id = rs1.getString(1);
        startdate = rs1.getString(2);
        starttime = rs1.getString(3);
        endtime = rs1.getString(4);
        enddate = rs1.getString(5);
        if(presentdate.equals(startdate) || presentdate.equals(enddate))
        {
            if(presenttime.equals(starttime))
            {
                String[] s1 = new String[]{"cmd", "/c","ec2-start-instances",instance_id,">>","D:\\logfile.log"};
                ProcessBuilder builder1 = new ProcessBuilder(s1);
                Process p1 = builder1.start();
                p1.waitFor();
            }
            else if(presenttime.equals(endtime))
            {
                String[] s1 = new String[]{"cmd", "/c","ec2-stop-instances",instance_id,">>","D:\\logfile.log"};
                ProcessBuilder builder1 = new ProcessBuilder(s1);
                Process p1 = builder1.start();
                p1.waitFor();
            }
        }
    }
4

3 に答える 3

0

ドキュメントにProcessBuilderよると:

このクラスは同期されていないことに注意してください。複数のスレッドが同時に ProcessBuilder インスタンスにアクセスし、少なくとも 1 つのスレッドが属性の 1 つを構造的に変更する場合は、外部で同期する必要があります。

Process p = new ProcessBuilder("myCommand", "myArg").start();

私の理解でProcessBuilderは、OS 上の他のソフトウェアと通信するために使用されます。(これは、外部のロギング スクリプトまたは何らかの形式のロギング ソフトウェアである可能性があります)


FileHandlerは、より標準的なファイル ロギング システムです。ただし、複数の呼び出しによる問題を回避するには、ロギング コードを静的にして、呼び出されたときにそのプロセスが終了することを確認します。FileHandlerデフォルトでフラッシュします(ドキュメントによる)。

少しでもお役に立てば幸いです

于 2014-06-17T13:20:35.813 に答える
0

それらは、ほとんど無関係な 2 つのオブジェクトと領域です。

はい、Process Builder は、ファイルに保存できる標準出力とエラー出力ストリームを提供しますが、データベースに保存したり、破棄したりすることもできます。

一方、ava.util.logging.FileHandler はロギング システムの付属部分です。私たちは通常、独自のコードにログを使用しますが、そこで呼び出した外部プロセスの出力をログに記録しても問題はありません。

ただし、プロセスがログを記録している間に他のクラスがログを記録すると、ログが混同されます。

同様に、50 個のプロセスを実行している場合は、同じファイルにログを記録しないことをお勧めします。しかし、50 のスレッドを使用して、50 の異なるファイルにログを記録します。各スレッドは、エラーと出力ストリームをチェックし、新しい行またはそのストリームの終わりがあるときに保存します。

すべてが完了したら、必要に応じてログ ファイルまたは新しいファイルにコピーできます。T

于 2014-06-17T13:42:11.100 に答える