У меня есть Servlet, у которого есть соотношение запросов около 10 000 запросов/час.
В котором я получил одно из этих двух исключений часто на той же линии, которая составляет около 5-6 раз, но не каждый раз, когда вызывается этот сервлет.
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();
Примечание. Потоки правильно закрыты в конце кода.
Это из-за высокого соотношения запросов? Дайте решение/предложение, если у вас есть.
Поскольку @jtahlborn справедливо упоминается в комментарии,
В коде отсутствует ошибка. Это происходит в основном, когда клиент closed
/broke
соединение или, возможно, interruption
/slowness
которые вы не можете контролировать.
К счастью, я никогда не сталкивался с этой ошибкой снова.
У меня была ошибка, подобная этой, где я получил "java.io.IOException: Stream closed" (ServletException). После тестирования каждой части службы отдельно я понял, что каким-то образом метод POST вызывает ошибку. Я заменил метод GET, и ошибка исчезла. Случай был аналогичным, получив ошибку один раз во время (например, 4-5 раз в час для запроса с задержкой 30 секунд). Теперь, через пару дней, я больше этого не видел.