У меня есть фрагмент кода, который считывает данные POST из входного потока запроса сервлета. Я использую java nio для чтения данных.Тайм-аут сокета при чтении из запроса сервлета inputstream
Для большинства случаев и обычных данных код работает отлично. Однако в некоторых случаях, когда данные велики (content length = 600000
), метод чтения канала, похоже, терпит неудачу с ошибкой таймаута Socket. Также, похоже, это происходит только с IE 9, он отлично работает с Firefox и Chrome.
Изучая это, я понял, что при использовании IE почтовые данные, по-видимому, занимают немного больше времени, чем другие браузеры, доступные для чтения. Поэтому я поставил Thread.sleep(400)
перед кодом, и код начал нормально работать и для IE.
Я не хочу спать перед этим кодом, один его просто обходной путь и не правильное решение, во-вторых, нет правильного времени сна, поскольку, если данные увеличиваются, 400 может быть недостаточно.
Есть ли способ, по которому я могу указать канал, чтобы не выходить из таймаута или вообще не удалять таймаут?
Ниже используется код,
ReadableByteChannel channel = Channels.newChannel(inputStream);
byte[] postData = new byte[contentLength];
ByteBuffer buf = ByteBuffer.allocateDirect(contentLength);
int numRead = 0;
int counter = 0;
while (numRead >= 0) {
buf.rewind();
numRead = channel.read(buf);
buf.rewind();
for (int i = 0; i < numRead; i++) {
postData[counter++] = buf.get();
}
}
return postData;
InputStream непосредственно с помощью request.getInputStream() и содержание длина с помощью request.getContentLength().
Используемый контейнер Tomcat 7.0.42 во встроенном режиме.
Опубликуйте свой код, тогда, возможно, мы сможем вам помочь! – isnot2bad
Является ли запрос POST из вашего кода на стороне клиента? Если да, то какая это технология? См. Следующее сообщение для тайм-аутов HTTP-запросов в java: http://stackoverflow.com/questions/1414795/how-to-specify-http-request-timeout-parameter-on-java-servlet-container. –
@MarkTielemans, Да POST сделан из кода на стороне клиента. Использование SmartGWT (инструментария javascript). Ссылка, о которой вы упомянули, по-видимому, содержит подробные сведения о тайм-аутах на стороне клиента. Хотя в моем случае ошибка, похоже, связана с отказом от сервера, а не ожиданиями. – Vicky