我有一个问题,导致JBOSS中的所有线程在读取输入流时阻塞.它不会意外发生,并且系统可以运行几天(或更长时间)后才开始受到影响.
该问题看起来与this问题类似,但我仍未尝试按照答案中的建议设置-Dhttp.keepAlive = false,因为我想知道其他人是否有其他/更好的解决方案.我宁愿不必通过将此属性设置为false来提高性能(假设甚至可以解决问题).
有一些Sun Bug谈论BufferedReader和InputStream读取问题(bug 6192696,bug 6409506),但是对我来说,它们似乎并没有定论.欢迎您提出这样的问题和Sun bug的想法/建议/经验.
这是例外:
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 AS4.0.5.GA.
另外,mod_jk正在将端口80上的HTTP请求从Apache服务器路由到JBoss服务器-如果有兴趣的话.
解决方法:
如果从基础TCP套接字读取时出了点问题,那么JkInputStream.receive将抛出一个无消息的IOException,不幸的是没有指定出什么问题.如果为org.apache包启用了所有日志级别并检查在引发异常之前记录的内容,则可能会找到有关问题原因的更多详细信息.