我有導致JBOSS所有線程在讀取輸入流,以阻止有問題。它不可預測地發生,並且系統在開始遭受損失之前可以運行數天(或更長時間)。JBOSS掛在org.apache.jk.common.JkInputStream.receive() - IOException的讀取HTTP請求的InputStream
問題類似於this的問題,但我還沒有嘗試設置-Dhttp.keepAlive=false
作爲答案建議,因爲我不知道其他人有不同的/更好的解決方案。我寧願不需要通過將此屬性設置爲false(假設甚至解決了問題)而導致性能下降。
有一些Sun的臭蟲談論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
下面是該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
從Apache服務器的路由端口80上的HTTP請求到JBoss服務器 - 如果這就是興趣。