Java 调用ServletOutputStream.close()后是否应该执行重载?
我希望这个问题符合Stack Overflow的问题指南中的“软件算法”: 我有一个JavaWeb应用程序,作为服务Servlet请求的一部分,它生成日志事件,从而调用持久性提供者。每个日志事件都会减慢servlet的响应时间 伪代码Java 调用ServletOutputStream.close()后是否应该执行重载?,java,tomcat,servlets,Java,Tomcat,Servlets,我希望这个问题符合Stack Overflow的问题指南中的“软件算法”: 我有一个JavaWeb应用程序,作为服务Servlet请求的一部分,它生成日志事件,从而调用持久性提供者。每个日志事件都会减慢servlet的响应时间 伪代码 doGet() { write log < slow write log < slow outputStream.write( response ) outputStream.close() } 这些日志事件不需要同步发生。但我不想使
doGet() {
write log < slow
write log < slow
outputStream.write( response )
outputStream.close()
}
这些日志事件不需要同步发生。但我不想使用线程池或其他巫毒,而是想收集这些日志事件,并在servlet编写内容后进行较慢的调用。在输出流上调用close应该鼓励servlet容器Tomcat立即编写响应
doGet() {
stash log < quick
stash log < quick
outputStream.write( response )
outputStream.close() < response goes to the client naow???
write log < slow
write log < slow
}
这些问题的答案可能是特定于容器的,因为我认为它们属于未记录行为的领域
在流关闭之后,但在doGet/doPost方法返回之前,是否将响应刷新到客户端?我正在执行“缓慢”的日志记录工作?Servlet过滤器链对这种行为有影响吗
下一个传入的请求,在一个持久连接上,或者仅仅来自另一个客户机,是否会阻止等待servlet方法返回
所以我想总的问题是
Servlet容器的请求分派器是否利用调用Servlet和编写响应之间的时间,而不是期望它立即返回?
是的,在你提出建议之前,我应该做一些实验 不,绝对不是,在这两种情况下。这些线程是请求处理程序。他们应该做的是处理请求。如果他们在写日志,他们就不会处理请求,不管是在完成响应之前还是之后 您应该做的是隐藏日志,然后异步记录它们。不要调用close。容器想要这样做。但是调用flush应该有同样的效果。