【发布时间】:2010-12-25 18:12:10
【问题描述】:
我有一个问题,导致 JBOSS 中的所有线程在读取输入流时都阻塞。它不会以可预见的方式发生,系统可以运行数天(或更长时间),然后才会开始受苦。
问题看起来类似于this 问题,但我还没有尝试按照答案中的建议设置-Dhttp.keepAlive=false,因为我想知道其他人是否有不同/更好的解决方案。我宁愿不必通过将此属性设置为 false 来影响性能(假设甚至可以解决问题)。
有一些 Sun 的 bug 谈到了 BufferedReader 和 InputStream 阅读(bug 6192696,bug 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
这是网络应用程序的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 服务器 - 如果感兴趣的话。
【问题讨论】:
标签: java jboss inputstream ioexception bufferedinputstream