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服务器的单元测试中模拟这个,我不确定这个问题的根本原因是什么。偶尔会发生这种情况。是否有捕获此错误的模式?是否发生了一些其他异常,说数据库连接丢失或者某些后台进程正在运行,比如在生产服务器中检索巨大的结果集?我只是想了解哪些情况可能会导致这个问题,以便我可以在编码过程中避免这种情况。
答案 0 :(得分:4)
jps
$ jps
1039 java
jstack
$ jstack 1039
$ kill -QUIT 1039
$ kill -3 1039
BLOCKED
中的线程)。相关:
答案 1 :(得分:1)
诊断此错误并不容易,因为这将始终是一个非常长的堆栈跟踪列表,它不属于我的应用程序。
您可能希望在此处共享堆栈跟踪 - 与ThreadMonitor挂起的线程消息(WSVR0605W)相关联。
基于Beryllium关于生成线程转储的答案,(kill -3 <pid>
工作正常),您可以使用IBM Thread and Monitor Analyzer工具查看生成的线程转储文件。该工具将显示线程状态 - 您将要查找名称以“Web容器:”开头的阻塞线程,并查看是否有关于监视器和其他线程的任何线索。实际上,我建议运行kill -3 <pid>
一次,等待大约15-30秒,然后再次运行kill -3 <pid>
。 Thread and Monitor Analyzer将允许您查看两者中的“差异”以查看哪些线程真正挂起而哪些线程可能只是缓慢运行。它还会提醒你任何堆耗尽。