2013-08-26 77 views
2
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中显示以下错误。是否有诊断WebSphere中发生线程挂起的做法?

[13年8月26日8:38:39:873 MYT] 0000002c ThreadMonitorW¯¯WSVR0605W:螺纹 “Web容器:9”(00000037)已活跃611221毫秒 并且可以被挂起。总共有7个线程在服务器中,可能会挂起 。

诊断这个错误并不容易,因为这总是会跟随一个非常长的堆栈跟踪列表,它不属于我的应用程序。通常它可能会在特定的时间段(大约15到20分钟)内发生几次,但线程ID可能不同。

我无法在UAT服务器的单元测试中模拟这个,我不确定这个问题的根本原因是什么。它偶尔会发生。有没有一种模式来捕捉这个错误?这是否发生在发生其他异常之后,说数据库连接已经丢失,或者可能是一些后台进程正在运行,比如说在生产服务器中检索巨大的结果集?我只是想了解什么情况会导致这个问题,以便在编码时避免这种情况。

+0

您是否手动创建线程orso? – BalusC

+0

没有。我确信应用程序中没有线程。 – huahsin68

回答

4
  • 确定您的WebSphere进程的PID,例如,通过使用jps

$ JPS
1039 java的


  • 通过创建一个完整的线程转储jstack

$ jstack 1039

  • 或者(如果你是在UNIX系统上):

$杀-QUIT 1039

$杀 - 3 1039


  • 确定哪些挂起线程(S)(您从日志文件中警告获得的名称)
  • 标识线,其中线程挂起
    • 寻找竞争条件,并发修改非并发对象/迭代器等。
  • 检查死锁以及(它们可能附加到全螺纹转储)
    • 一个例子并死锁是here(寻找在状态BLOCKED线程)。

相关:

1

这是不容易的诊断这个错误,因为这将总是一个很长的堆栈跟踪的列表,它是遵循不属于我的申请。

您可能希望在此共享堆栈跟踪 - 一个与ThreadMonitor挂起的线程消息(WSVR0605W)关联。

建立在铍的生成线程转储的答案上(kill -3 <pid>正常工作),可以使用IBM Thread and Monitor Analyzer工具查看生成的线程转储文件。该工具将显示线程状态 - 您需要查找名称以“Web Container:”开头的阻止线程,并查看是否有任何与监视器和其他线程有关的线索。实际上,我建议一次运行kill -3 <pid>,等待大约15-30秒,然后再运行kill -3 <pid>Thread and Monitor Analyzer将允许您查看两者的“差异”,以查看真正挂起的线程与可能正在缓慢运行的线程。它还会提醒你任何堆耗尽。