【问题标题】:Should I do heavy lifting after calling ServletOutputStream.close()?调用 ServletOutputStream.close() 后我应该做繁重的工作吗?
【发布时间】:2014-09-08 07:22:45
【问题描述】:

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

我有一个 Java Web 应用程序,作为服务 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 被调用和响应写入之间的时间,而不是期望它立即返回?

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

【问题讨论】:

标签: java tomcat servlets


【解决方案1】:

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

您应该做的是存储日志和/或异步记录它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2021-11-08
    相关资源
    最近更新 更多