1

我有一个实用程序,Jmeter 发送请求,实用程序将响应发送回 Jmeter。当负载增加时,实用程序会以“EXCEPTION_ACCESS_VIOLATION”关闭。

由于这是一个错误,我无法在 catch 块中处理它。当错误发生时,我创建了第二个实用程序来重新启动第一个实用程序。下面是第二个,restart,实用程序的代码。在第二个实用程序的代码中,在第二个 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();
    }
}

我通过 jvisualvm 分析了进程,当我启动第二个(重新启动)实用程序时,我发现两个 java 进程处于运行模式。我可以看到第一个实用程序正在定期重新启动,因为它的 PID 在 jvisualvm 中经常更改,并且在任务管理器中也发生了同样的情况。一切都进行得很好。

一段时间后,我发现 Jvisualvm 中只有一个进程,即第二个(重新启动)实用程序。这意味着第一个实用程序 JVM 只是猜测不确定。这里发生了一些不寻常的事情。因为如果JVM崩溃了,那么它应该重新启动。所以我打开任务管理器,发现那里存在第一个实用程序 PID,但它并没有像启动时发生的那样改变。如果我从任务管理器中明确终止进程(第一个实用程序)。Seconds 实用程序再次重新启动第一个实用程序同样的事情再次发生,一段时间后第一个实用程序从 jvisualvm 中消失,存在于 taskmanager 中并从 taskmanager 中删除进程。需要做什么?

4

3 回答 3

2

尝试使用 .ready() 函数。

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

对标准输出做同样的事情。

它对我来说就像一个魅力。

于 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 回答