我希望这个问题符合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方法返回?
所以我猜整体问题是
是的,在你建议之前,我应该进行一些实验。 :)
答案 0 :(得分:0)
不,绝对不是,无论哪种情况。这些线程是请求处理程序。他们应该做的是处理请求。如果他们正在写日志,他们就不会处理请求,无论是在完成响应之前还是之后。
您应该做的是隐藏日志和/或以异步方式记录它们。