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 サーバーの単体テストでこれをシミュレートすることができず、この問題の根本的な原因が何であるかがわかりませんでした。それは時々起こります。このエラーをキャプチャするパターンはありますか? DB接続が失われた、またはバックグラウンドプロセスが実行されていたなど、他の例外が発生した後、本番サーバーで巨大な結果セットを取得した後に発生しますか? コーディング中にこれを回避できるように、どのような状況がこの問題につながる可能性があるかを理解しようとしています。