Java 为什么我的进程挂起在input.readLine()?

Java 为什么我的进程挂起在input.readLine()?,java,jmeter,Java,Jmeter,我有一个实用程序,其中Jmeter发送一个请求,该实用程序将响应发送回Jmeter。当负载增加时,实用程序将关闭,并出现“异常访问冲突” 由于这是一个错误,我无法在catch块中处理它。我制作了第二个实用程序,在错误发生时重新启动第一个实用程序。下面是第二个重启实用程序的代码。在第二个实用程序的代码中,在秒while时,我的程序有时会挂起。如何检测并重新启动该过程 publicstaticvoidmain(字符串[]args) { 字符串行=null; 字符串currPID=null; 尝试 {

我有一个实用程序,其中Jmeter发送一个请求,该实用程序将响应发送回Jmeter。当负载增加时,实用程序将关闭,并出现“异常访问冲突”

由于这是一个错误,我无法在catch块中处理它。我制作了第二个实用程序,在错误发生时重新启动第一个实用程序。下面是第二个重启实用程序的代码。在第二个实用程序的代码中,在秒while时,我的程序有时会挂起。如何检测并重新启动该过程

publicstaticvoidmain(字符串[]args)
{
字符串行=null;
字符串currPID=null;
尝试
{
while(true)
{
Process Process=Runtime.getRuntime().exec(“java-XX:+HeapDumpOnOutOfMemoryError-Xms250M-Xmx500M-XX:ErrorFile=NUL ws”);
BufferedReader输入=新的BufferedReader(新的InputStreamReader(process.getInputStream());
while((line=input.readLine())!=null)//程序在这一行阻塞
{
如果(line.trim().length()!=0)
{
if(行起始带(“PID”))
{
currPID=行子字符串(行索引(“@”)+1);
}
}
}
系统输出打印项次(“结束”);
}
}
捕获(例外e)
{
e、 printStackTrace();
}
}

我通过jvisualvm分析了该进程,在启动第二个(重启)实用程序时,我发现有两个java进程处于运行模式。我可以看到第一个实用程序定期重新启动,因为它的PID在jvisualvm中频繁变化,在TaskManager中也发生了同样的情况。一切都进展得很顺利

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

您的挂起问题似乎出现在调用
readLine

readLine
用于读取行。方法将不会返回,直到调用确定已到达行尾。它期望换行符或通信完全停止

您的第一个实用程序是否不发送新行字符

您的第一个实用程序是否无法关闭流

如果两个问题的答案都是肯定的,您的while通话将无限期挂起


您最好使用
扫描仪
类的自定义实现。

您的挂起问题似乎出现在调用
readLine时

readLine
用于读取行。方法将不会返回,直到调用确定已到达行尾。它期望换行符或通信完全停止

您的第一个实用程序是否不发送新行字符

您的第一个实用程序是否无法关闭流

如果两个问题的答案都是肯定的,您的while通话将无限期挂起


您最好使用
Scanner
类的自定义实现。

尝试使用
getErrorStream()
它将捕获错误消息,如果使用
getInputStream()
它将只读取成功消息或反馈消息

例如:如果执行以下命令并使用
getInputStream()
读取流程消息

您只能收到诸如“网络驱动器连接成功”之类的反馈消息,但不能收到错误消息


如果使用
getErrorStream()
读取进程消息,它将读取错误消息,如“未找到网络驱动器”。当进程执行时,它将向
getInputStream()
getErrorStream()
发送消息。因此,使用这两种方法从流程中读取消息,如果我正确,这将起作用。我只是想给你一个想法,但我不确定。

尝试使用
getErrorStream()
它会捕获错误消息,如果使用
getInputStream()
它将只读取成功消息或反馈消息

例如:如果执行以下命令并使用
getInputStream()
读取流程消息

您只能收到诸如“网络驱动器连接成功”之类的反馈消息,但不能收到错误消息

如果使用
getErrorStream()
读取进程消息,它将读取错误消息,如“未找到网络驱动器”。当进程执行时,它将向
getInputStream()
getErrorStream()
发送消息。因此,使用这两种方法从流程中读取消息,如果我正确,这将起作用。我只是想给你一个想法,但我不确定。

尝试使用.ready()函数

try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}
对stdout执行同样的操作

它对我来说很有魅力。

尝试使用.ready()函数

try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}
对stdout执行同样的操作


它对我来说就像一个符咒。

除了
异常
之外,您还可以通过向catch class
error
添加catch块来处理
catch
块中的错误,或者如果这是测试代码,只需添加
Throwable
。请参阅此处了解更多详细信息:但在何处放置catch块以查找错误。它可能会破坏程序的正常流程。目前的目的是尝试捕获错误的堆栈跟踪。最简单的方法是将
(例外e)
替换为
(可丢弃的e)
;正确的方法是添加第二个捕获