是否有诊断WebSphere中发生的线程挂起的做法?

时间:2013-08-26 09:25:14

标签: java-ee websphere

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服务器的单元测试中模拟这个,我不确定这个问题的根本原因是什么。偶尔会发生这种情况。是否有捕获此错误的模式?是否发生了一些其他异常,说数据库连接丢失或者某些后台进程正在运行,比如在生产服务器中检索巨大的结果集?我只是想了解哪些情况可能会导致这个问题,以便我可以在编码过程中避免这种情况。

2 个答案:

答案 0 :(得分:4)

  • 确定WebSphere流程的PID,例如使用jps
  

$ jps
  1039 java


  • 使用jstack
  • 创建完整的主题转储
  

$ jstack 1039

  • 或者(如果您使用的是UNIX系统):
  

$ kill -QUIT 1039

     

$ kill -3 1039


  • 识别挂起的线程(从日志文件中的警告中获取名称)
  • 标识线程挂起的行
    • 查看竞争条件,非并发对象/迭代器中的并发修改等。
  • 检查死锁(它们可能附加到完整的线程转储)
    • 死锁的示例是here(查找状态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将允许您查看两者中的“差异”以查看哪些线程真正挂起而哪些线程可能只是缓慢运行。它还会提醒你任何堆耗尽。