当我注意到某个Web应用程序存在调用resonse.getWriter()
并向其输出的情况时,此PrintWriter
永远不会被刷新或关闭。
没有进一步的写入,所以我可以安全地冲洗或关闭它。应用程序似乎在没有关闭编写器的情况下正常工作,并且在org.apache.catalina.connector.CoyoteAdapter
中无论如何都调用了finishResponse()/finishRequest()
,但这是tomcat的内部工作方式,似乎依赖于错误。
关闭作者似乎是错误的,因为我不确定我是否真的用response.getWriter()
调用打开了作者。 (通常不认为)
没有做任何冲洗或关闭,感觉我在某些情况下可能会泄漏资源。
答案 0 :(得分:7)
您不需要flush()
或close()
Writer
。
这是Servlet 3.1规范所说的内容:
5.6关闭响应对象
当响应关闭时,容器必须立即刷新所有响应 将响应缓冲区中的内容留给客户端。下列 事件表明servlet满足了请求和那个 响应对象将被关闭:
- 终止servlet的服务方法。
- 诸如此类
由此我们可以推断,当服务方法返回或由于异常而终止时,应该刷新响应 。
我无法找到任何明确说明您不需要close()
响应作者的内容。但是,由于Web容器管理套接字,因此在请求生命周期(或连接生命周期......如果使用持久连接)时不能正确关闭它们将是疯狂的。因此,我认为如果你忽略了调用close()
,就可以安全地假设不会出现资源泄漏。 (当然,没有一个设计良好的网络容器。)
另一方面,如果您知道编写器或输出流是当前请求的响应流/写入器,则在请求处理结束时,您的servlet代码刷新和/或关闭它们是没有害处的。