public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if ((request instanceof HttpServletRequest)
&& (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
if (isSessionControlRequiredForThisResource(httpServletRequest)) {
if (isSessionInvalid(httpServletRequest)) {
String encodedURL = httpServletRequest.getContextPath() + this.timeoutPage;
try {
httpServletResponse.sendRedirect(encodedURL);
} catch (Exception e) {
logger.error("[Error happened in filter] : ", e.fillInStackTrace());
}
return;
}
}
if (!httpServletRequest.getRequestURI().startsWith(httpServletRequest.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
}
}
chain.doFilter(request, response);
}
上面显示的代码有时可能会在任务期间失败,导致出现以下错误SystemOut.log
。
[8/26/13 8:38:39:873 MYT] 0000002c ThreadMonitor W WSVR0605W:线程“WebContainer:9”(00000037) 已活动 611221 毫秒,可能已挂起。服务器中总共有 7 个线程可能被挂起。
诊断这个错误并不容易,因为它后面总是有一个很长的堆栈跟踪列表,它不属于我的应用程序。通常它可能会在一段时间内(大约 15 到 20 分钟)发生几次,但线程 ID 可能不同。
我无法在 UAT 服务器的单元测试中模拟这一点,我不确定这个问题的根本原因是什么。它偶尔会发生。是否有捕获此错误的模式?它是否发生在其他一些异常发生后,比如数据库连接丢失或者某个后台进程正在运行,比如在生产服务器中检索巨大的结果集?我只是想了解什么情况会导致这个问题,这样我就可以在编码过程中避免这种情况。