入力ストリームの読み取り中にJBOSSのすべてのスレッドがブロックされる問題があります。これは予測どおりに発生するわけではなく、システムが問題を起こし始めるまでに数日(またはそれ以上)実行される可能性があります。
問題はこの質問に似てい-Dhttp.keepAlive=false
ますが、他の誰かが別の/より良い解決策を持っているかどうか疑問に思ったので、私はまだ答えで推奨されているように設定しようとはしていません。このプロパティをfalseに設定することでパフォーマンスが低下する必要はありません(問題が解決すると仮定します)。
BufferedReader
とInputStream
読書の問題について話しているSunのバグがいくつかありますが(バグ6192696、バグ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
これがWebアプリケーションのコードです。それは立ち往生し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バージョン:JBossAS4.0.5.GA。
また、mod_jk
ポート80でHTTPリクエストをApacheサーバーからJBossサーバーにルーティングしています。