在调用ServletOutputStream.close()之后,我应该进行繁重的工作吗?

时间:2014-09-08 07:22:45

标签: java tomcat servlets

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

我有一个Java Web应用程序,作为服务Servlet请求的一部分,它生成日志事件,这些事件会向持久性提供程序发出标注。每个日志事件都会减慢servlet的响应时间。

...伪代码

doGet() {
  write log < slow
  write log < slow
  outputStream.write( response )
  outputStream.close()
}

这些日志事件不需要同步发生。但是我没有使用线程池或其他一些voodoo,而是想知道收集这些日志事件,并且只有在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和写入响应之间的时间,而不是期望它立即返回?

是的,在你建议之前,我应该进行一些实验。 :)

1 个答案:

答案 0 :(得分:0)

不,绝对不是,无论哪种情况。这些线程是请求处理程序。他们应该做的是处理请求。如果他们正在写日志,他们就不会处理请求,无论是在完成响应之前还是之后。

您应该做的是隐藏日志和/或以异步方式记录它们。