【发布时间】: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