2014-10-13 3 views
1

Когда веб-приложение я заметил, что были случаи, когда resonse.getWriter() был вызван и выведен на него, этот PrintWriter никогда не краснеет и не закрывается.Response.getWriter() должен быть закрыт/сброшен

Нет дальнейших записей, поэтому я мог бы, вероятно, сбросить или закрыть его безопасно. Приложение, похоже, отлично работает, не закрывая авторов, а в org.apache.catalina.connector.CoyoteAdapter действительно вызывает finishResponse()/finishRequest(), но это внутренняя работа tomcat и кажется неправильной полагаться.

Закрытие писателя кажется неправильным, потому что я не уверен, действительно ли я открыл автора с вызовом response.getWriter(). (обычно я не думаю)

Промывка кажется скорее хорошей идеей, но я уверен, что это считается правильным.

Не делать ни флеша, ни закрытия, похоже, что я могу утечка ресурсов в определенных случаях.

+0

Промывка и закрытие - лучшая практика, так что в чем вопрос? –

+1

На ответ ниже, он не нужен. Однако, если вы выполняете многосердечный ответ сервлета, который может писать разные типы, использование функции close() поможет с отладкой, если вы попытаетесь записать ее после ее закрытия. – Compass

ответ

6

Вам не нужно flush() или close()Writer.

Вот что говорит Servlet 3.1 спецификации:

5,6 Закрытие отклика объекта

Когда ответ закрыт, контейнер должен немедленно промойте все оставшееся содержимое в буфер ответа клиенту. Следующие события свидетельствуют о том, что сервлет удовлетворил просьбу и что объект ответ должен быть закрыт:

  • Прекращение метода обслуживания сервлета.
  • так далее

Из этого мы можем заключить, что ответ должен быть промыты, когда метод службы либо возвращается, или прекращает за счет исключения.

Я не могу найти ничего, что явно указывает, что вам не нужно close() ответ Writer. Однако, поскольку веб-контейнер управляет сокетами, было бы безумным, если бы он не закрывал их должным образом в точке жизненного цикла запроса (или жизненного цикла соединения ... если используются постоянные соединения). Следовательно, я думаю, что можно с уверенностью предположить, что утечка ресурса не будет, если вы пренебрегли вызовом close(). (Конечно, не было бы для хорошо спроектированного веб-контейнер.)


С другой стороны, если вы знаете, что поток писатель или выходной поток ответа/записи для текущего запроса, то не вредит вашему сервлет-коду, смывая и/или закрывая его в конце обработки запроса.

Смежные вопросы