2016-05-21 24 views
0

は、私は、次のクラスがありますSpring MVC Webサイト内のThreadLocalオブジェクトを削除しますか?

public class AppContext { 

    private static final ThreadLocal<AppContextData> contextHolder = new ThreadLocal<AppContextData>() { 

     @Override 
     protected AppContextData initialValue() { 
      return new AppContextData(); 
     } 
    }; 

    public static AppContextData get() { 
     return contextHolder.get(); 
    } 

    public static void unset() { 
     contextHolder.remove(); 
    } 
} 

public class AppContextData { 
    //many getter and setter methods 
} 

ウェブサイトは、インターセプタでThreadLocalのオブジェクトを使用して開始したオブジェクトは、Webリクエスト全体を通して使用されています。

public class MyIntercepter extends HandlerInterceptorAdapter { 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 

     AppContext.get(); 
     //..... 
    } 
} 

私はTomcat 8.xでこのWebサイトを実行していますが、ログに次のエラーメッセージがあることがわかりました。

この問題を解決するにはどうすればよいですか?

ありがとうございました!

20月 - 2016年22:43:53.657 SEVERE [ローカルホスト-startStop-2]は、Webアプリケーション[ROOT]はタイプのキーでThreadLocalのを作成org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks [my.organization .data.AppContext $ 1](値[[email protected]])およびタイプ[my.organization.data.AppContextData]の値(値[[email protected]]) Webアプリケーションが停止したときに削除に失敗しました。スレッドは時間の経過とともに更新され、メモリリークの可能性を回避しようとしています。

+1

AppContext.unset()が呼び出されていることを確認してください。 Tomcatは、明示的にThreadLocalを削除することを望みます。 – JanPl

答えて

1

JanPiはすでにコメントに私たちがしなければならないことを言った。場合、誰かがここにある、どのようについて不思議:

public class MyIntercepter extends HandlerInterceptorAdapter { 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 
     AppContext.get(); 
     //..... 
    } 

    public void afterCompletion(
     HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     AppContext.unset(); 
    } 

    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{ 
     // only relevant when a handler starts an asynchronous request. 
     AppContext.unset(); 
    } 
} 

postHandle方法が良い場所のように見えますが、別名(ハンドラが正しく要求を処理するために失敗した場合にも呼ばれていますので、afterCompletionが優れています例外が発生しました)。

関連する問題