我有一个Servlet,其请求率约为10,000请求/小时。
其中,我经常在同一行中得到这两个异常中的一个,每天约5到6次但不是每次调用这个Servlet时都会这样。
java.io.IOException: Stream closed
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.read1(BufferedReader.java:205)
at java.io.BufferedReader.read(BufferedReader.java:279)
或
java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:287)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.read1(BufferedReader.java:205)
at java.io.BufferedReader.read(BufferedReader.java:279)
这两个异常都发生在同一条线上。我不知道为什么? 相同类型的所有请求都已完成并成功响应。
这是我的代码:
InputStream ist = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ist));
StringBuffer sb = new StringBuffer();
char[] c = new char[1];
while(in.read(c, 0, 1) == 1) // Getting exception at this line
{
sb.append(c[0]);
}
String payload = sb.toString();
注意:代码末尾的流已正确关闭。
是因为要求比率高吗?如果您有任何解决方案/建议,请给出解决方案/建议。
答案 0 :(得分:1)
正如@jtahlborn在评论中正确提到的那样,
代码中没有错误。它主要发生在客户端closed
/ broke
连接或您无法控制的网络interruption
/ slowness
时。
幸运的是,我再也没遇到过这个错误。
答案 1 :(得分:0)
我遇到了类似于这个的错误,我收到了'java.io.IOException:Stream closed'(ServletException)。 在分别测试服务的每个部分之后,我意识到POST方法不知何故让我犯了错误。我替换了GET方法,错误消失了。 情况类似,一次进入错误(如同30秒延迟请求,每小时4-5次)。 现在,经过几天,我还没有看到它。