Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用ServletOutputStream.close()后是否应该执行重载?_Java_Tomcat_Servlets - Fatal编程技术网

Java 调用ServletOutputStream.close()后是否应该执行重载?

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() } 这些日志事件不需要同步发生。但我不想使

我希望这个问题符合Stack Overflow的问题指南中的“软件算法”:

我有一个JavaWeb应用程序,作为服务Servlet请求的一部分,它生成日志事件,从而调用持久性提供者。每个日志事件都会减慢servlet的响应时间

伪代码

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应该有同样的效果。