java - 调用 ServletOutputStream.close() 后我应该做繁重的工作吗?

标签 java tomcat servlets

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

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

伪代码...

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

这些日志事件不需要同步发生。但是我没有使用线程池或其他一些巫术,而是想收集这些日志事件,并且只在 servlet 写入其内容后才进行这些较慢的标注。在输出流上调用关闭应该鼓励 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 - 调用 ServletOutputStream.close() 后我应该做繁重的工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719195/

相关文章:

java - 无法调用 getWriter(),getOutputStream() 已调用

java - 如何让 java servlet 更高效地输出大量数据?

java - Servlet + Java 的 HttpSession 不起作用

java - 我们如何删除日志文件中的额外消息

tomcat - 莺 - 没有这样的文件加载错误

servlets - 如何将 servlet 映射到/*,它会因无限循环而失败并最终导致 StackOverflowError

java - 在没有 try/catch block 的情况下关闭 InputStream?

java - 使用 Spring Boot 和 Cassandra 时出现 Maven 编译错误

java - 运行 tomcat 时出现 ExceptionInInitializerError(从 ServletContextListner 初始化 hibernate SessionFactory 对象)

jquery - JSESSIONID Cookie 被拒绝/丢失