【发布时间】: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 被调用和响应写入之间的时间,而不是期望它立即返回?
是的,在您提出建议之前,我应该进行一些实验。 :)
【问题讨论】:
-
不要打电话给
close。容器想要这样做。 stackoverflow.com/questions/1829784/… 但是调用flush应该有同样的效果。