1

Jmeter がリクエストを送信し、ユーティリティが Jmeter に応答を返すユーティリティがあります。負荷が増加すると、ユーティリティは「EXCEPTION_ACCESS_VIOLATION」でシャットダウンします。

エラーなのでcatchブロックでは扱えません。エラーが発生したときに最初のユーティリティを再起動するための 2 つ目のユーティリティを作成しました。以下は、2 番目の再起動ユーティリティのコードです。この 2 番目のユーティリティのコードでは、2 番目の whileで、プログラムがハングすることがあります。これを検出してプロセスを再起動するにはどうすればよいですか?

public static void main(String[] args)
{
    String line = null;
    String currPID = null;
    try
    {
        while(true)
        {
            Process process = Runtime.getRuntime().exec("java -XX:+HeapDumpOnOutOfMemoryError -Xms250M -Xmx500M -XX:ErrorFile=NUL ws ");
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((line = input.readLine()) != null) //Program stucks at this Line
            {
                if(line.trim().length() != 0)
                {
                    if(line.startsWith("PID"))
                    {
                        currPID = line.substring(line.indexOf("@")+1);
                    }
                }
            }
            System.out.println("Ended");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

2番目の(再起動)ユーティリティを起動すると、2つのJavaプロセスが実行モードになっていることがわかりました。最初のユーティリティが定期的に再起動していることがわかります。これは、その PID が jvisualvm で頻繁に変更され、タスク マネージャーでも同じことが起こっているためです。すべてが非常に順調に進んでいます。

しばらくして、Jvisualvm、つまり2番目の(再起動)ユーティリティにプロセスが1つしかないことがわかりました。これは、最初のユーティリティ JVM がクラッシュしたことを意味します。ここで異常なことが起こっています。JVMがクラッシュした場合は再起動する必要があるためです。だから私はタスクマネージャーを開いて、そこに最初のユーティリティPIDが存在することを発見しましたが、起動時に起こっているように変化していません。タスクマネージャーから明示的にプロセス(最初のユーティリティ)を強制終了した場合。Seconds ユーティリティが再び最初のユーティリティを再起動すると、同じことが再び起こります。しばらくすると、最初のユーティリティが jvisualvm から消え、タスクマネージャに存在し、タスクマネージャからプロセスを削除します。何をする必要がありますか?

4

3 に答える 3

2

.ready() 関数を使用してみてください。

try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}

stdout についても同じことを行います。

それは私にとって魅力のように機能しました。

于 2016-06-09T08:25:52.663 に答える
1

使用するgetErrorStream()とエラー メッセージがキャッチされます。使用するgetInputStream()と、成功メッセージまたはフィードバック メッセージのみが読み取られます。

例:次のコマンドを実行し、を使用してプロセスメッセージを読むとgetInputStream()

Process process = Runtime.getRuntime().exec("net use u: \\sharedIP\sharedFolder");
BufferedReader input = new BufferedReader(new inputStreamReader(process.getInputStream()));

「ネットワーク ドライブが正常に接続されました」などのフィードバック メッセージしか表示されず、エラー メッセージは表示されません。

getErrorStream()プロセス メッセージの読み取りに使用すると、「ネットワーク ドライブが見つかりませんでした」などのエラー メッセージが表示されます。getInputStream()プロセスが実行されると、 または のいずれかにメッセージが送信されますgetErrorStream()。したがって、両方の方法を使用してプロセスからメッセージを読み取ります。正しければ、これは機能します。アイデアを提供しようとしているだけですが、よくわかりません。

于 2013-10-08T17:20:46.783 に答える
1

ぶら下がっている問題は、 への呼び出しにあるようreadLineです。

readLine行を読むためのものです。このメソッドは、呼び出しが行末に到達したことを確認するまで戻りません。改行文字または通信の完全な停止のいずれかが必要です。

最初のユーティリティが改行文字を送信していませんか?

最初のユーティリティでストリームを閉じられませんか?

両方の質問に対する答えが「はい」の場合、while 呼び出しは無期限にハングします。

Scannerクラスのカスタム実装を使用する方がよい場合があります。

于 2013-10-08T16:50:53.553 に答える