Написание большого содержимого для ответа сервлета не выполняется

tdudgeon спросил: 28 апреля 2018 в 09:08 в: tomcat

У меня есть простой сервлет (работает в Tomcat8), который может быть сокращен следующим образом:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/plain");
    OutputStream out = resp.getOutputStream();
    byte[] b = "some very large content\n".getBytes()
    for (int i=0; i<1000; i++) {
        out.write(b);
    }
}

Я использую Apache HTTPClient для использования этого, по существу, следующим образом:

CloseableHttpResponse response = ...;
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();

Для небольших размеров данных он отлично работает, но если данные получают за определенный размер, клиент не потребляет ответ. Кажется, что ничего не отправляется?

Важно отметить, что я не знаю размер данных заранее, поэтому не могу указать заголовок Content-Length.

Каков правильный подход для отправки больших ответов на неизвестный размер?


1 ответ

ответил: 07 мая 2018 в 11:38

Извините, не могу комментировать!

Одной из причин может быть время ожидания чтения и записи. Tomcat закрывает соединение, когда операция чтения / записи становится длинной. (Ссылка). ( проблема с семей )

Вы можете попробовать установить таймаут соединения на -1 (без тайм-аута) и повторить попытку, но это не хорошо, если вы работаете BIO (либо соединение, либо бэкэнд-операторы).