JBOSS挂在org.apache.jk.common.JkInputStream.receive() - 读取HTTP请求的IOException InputStream

时间:2009-12-11 17:12:20

标签: java jboss inputstream ioexception bufferedinputstream

我遇到一个问题,导致JBOSS中的所有线程在读取输入流时被阻塞。它不会以可预测的方式发生,系统可能会在开始受损之前运行数天(或更长时间)。

此问题与this问题类似,但我还没有尝试按照答案中的建议设置-Dhttp.keepAlive=false,因为我想知道是否有其他人有不同/更好的解决方案。我宁愿通过将此属性设置为false来避免性能损失(假设甚至可以解决问题)。

有一些Sun漏洞会讨论BufferedReaderInputStream阅读(bug 6192696bug 6409506)的问题,但对我来说,它们似乎有点不确定。您对这样的问题以及Sun漏洞的想法/建议/经验表示欢迎。

以下是例外:

java.io.IOException
    at org.apache.jk.common.JkInputStream.receive(JkInputStream.java:190)
    at org.apache.jk.common.JkInputStream.refillReadBuffer(JkInputStream.java:249)
    at org.apache.jk.common.JkInputStream.doRead(JkInputStream.java:168)
    at org.apache.coyote.Request.doRead(Request.java:418)
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:284)
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:404)
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:299)
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:192)
    at com.vicinity.ExtractMessageServlet.service(ExtractMessageServlet.java:62)
    ...

以下是请求标头的示例:

POST http: //www.xyz.com HTTP/1.0
Host: www.xyz.com:80
Accept: */*
Content-Type: application/octet-stream
Content-Length: 00597
Session-Key: 812a0000

以下是Web应用程序的Servlet代码。它被卡在servletInputStream.read

int lengthOfBuffer = request.getContentLength();
byte[] buffer = new byte[lengthOfBuffer];
ByteArrayOutputStream output = new ByteArrayOutputStream(lengthOfBuffer);
ServletInputStream servletInputStream = request.getInputStream();
int readBytes = -1;
while ((readBytes = servletInputStream.read(buffer, 0, lengthOfBuffer)) != -1) {
    output.write(buffer, 0, readBytes);
}
byte[] inputStream = output.toByteArray();
...
// Continue to process the input stream

JBoss版本:JBoss AS 4.0.5.GA.
此外,mod_jk将端口80上的HTTP请求从Apache服务器路由到JBoss服务器 - 如果感兴趣的话。

1 个答案:

答案 0 :(得分:4)

如果在从底层TCP套接字读取时出现问题,JkInputStream.receive将抛出无消息的IOException,遗憾的是,未指定 出错了什么。如果启用org.apache包的所有日志级别并检查在抛出异常之前记录的内容,您可能会找到有关问题原因的更多详细信息。