调试运行在Tomcat 7.0.59上的Web应用程序时,我注意到请求侦听器requestDestroyed()
中的日志消息未打印。
public class RequestListener implements ServletRequestListener {
.
.
.
@Override
public void requestInitialized(ServletRequestEvent sre) {
log.debug("Init Request for thread " + System.identityHashCode(Thread.currentThread()));
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.debug("Destroying Request for thread " + System.identityHashCode(Thread.currentThread()));
}
}
但是,requestInitialized()
中的消息确实出现了。进一步研究,我注意到处理请求的servlet称为
response.sendError(HttpServletResponse.SC_NOT_MODIFIED)
。
将其更改为response.setStatus(HttpServletResponse.SC_NOT_MODIFIED)
后,正在调用requestDestroyed
并且正在打印消息。通过查看Tomcat类StandardHostValve,我看到了为什么以前没有调用它:
if (!request.isAsync() && !response.isErrorReportRequired()) {
context.fireRequestDestroyEvent(request);
}
调用sendError()
时,isErrorReportRequired
返回true
。
我找不到任何文档说明为什么有条件地调用fireRequestDestroyEvent()
的原因。到达这一点时,它是否指示请求生命周期的结束,而不管是否存在错误?
我想我可以使用过滤器来完成requestDestroyed()
中正在执行的操作,但是想让监听器实现其目的:)
感谢您的时间!