【问题标题】:How to fix/avoid java.io.IOException: Socket read failed?如何修复/避免 java.io.IOException:套接字读取失败?
【发布时间】:2016-05-21 16:50:07
【问题描述】:

我们有一个应用程序对 servlet 进行频繁的 ajax 调用。我们不一致地得到以下异常。

20:39:15.016 com.abc.xyzhome.util.XYZLog:XYZDashboardServlet::buildXYZDashboardRequest::Exception:
java.io.IOException: Socket read failed
        at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:313)
        at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)
        at org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)
        at org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:664)
        at org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1142)
        at org.apache.coyote.Request.doRead(Request.java:422)
        at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)
        at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:353)
        at org.apache.tomcat.util.buf.CharChunk.substract(CharChunk.java:439)
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:416)
        at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:108)
        at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:163)
        at com.abc.xyzhome.XYZDashboardServlet.buildXYZDashboardRequest(XYZDashboardServlet.java:456)

当我们尝试从 inputStream 读取数据时,有时会发生这种异常。 PFB,这个异常发生的地方。

        try {
             BufferedReader reader = request.getReader();
             while ((line = reader.readLine()) != null)
                jb.append(line);
        }  catch (IOException e) {
            e.printStackTrace();
        }

我们从HttpServletRequest 获取BufferedReader 对象。异常发生在reader.readLine()

我们的应用程序托管在 Tomcat 7.0.54 中。 PFB,我们为这个特定请求从客户端发出的 angularJS ajax 调用。

$http({
      method: 'POST',
      url: 'XYZDashboard',
      headers: {'Content-Type': 'application/json'},
      data: {'xyzStatus':fav_value,'xyzRequestType':'getDataForXYZDashboard'},
      cache: false,
    }).success(function (data) 
    {
        //Some code here
    });

内容类型为 JSON。请让我知道如何避免此异常。谢谢。

编辑:我尝试BufferedReader ready() 来检查流是否准备好被读取,但它总是返回false。我在一篇博客中读到,在 Tomcat 中,ready() 总是返回 false。请指教。

【问题讨论】:

  • 输入流会很大吗?服务器的负载会很高吗?可能是连接超时。
  • 输入流没有那么大。这个例外并不一致。这种情况很少发生。即使我们尝试用相同的用户(相同的请求)重现它,它也不会经常发生。我猜网络延迟也可能是我猜想的因素之一。
  • 流的大小只是影响因素之一。请求的数量是另一个重要因素。线程之间的上下文切换非常昂贵。如果有多个请求,如果服务器的核心数量最少,则会产生多个线程,从而增加上下文切换的数量。处理超时将是理想的。
  • 重新编辑,致电ready() 毫无意义。只需阻塞 read 方法。这里的实际问题是 Apache AJP 的无用错误消息。他们应该已经打印了原始异常中的错误消息。

标签: java angularjs apache tomcat httpd.conf


【解决方案1】:

将您的代码包装在抛出 IOException 的 try/catch 中

try {
    BufferedReader reader = request.getReader();
    while ((line = reader.readLine()) != null)
} catch (IOException e1) {
    e1.printStackTrace();
}

【讨论】:

  • 感谢您的回复。我们已经将代码包装在一个 try-catch 块中。我们正在检查是否有办法避免或修复此异常。
  • 编译器会在 BufferedReader 的 readLine() 处强制执行检查异常。
  • 这将完成什么? OP 已经有一个堆栈跟踪。他需要的是一个解决方案。
  • OP 编辑​​了他的原始帖子以包含我添加的包装器作为答案。虽然我承认正如@Prasanna 所建议的那样,IDE 会接受我的建议,但请给我一点休息时间。他没有含蓄地声明他已经正确包装了它,所以我将其作为建议提供。这是我在 StackOverFlow 上的第一个答案,感谢社区的热烈欢迎!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多