2015-01-27 5 views
2

Tomcat에는 활성 세션 컬렉션에 액세스하기위한 API가 없으므로 WebApp에 대한 HttpSessionListener를 디자인하고 싶습니다.하지만 구현과 관련하여 몇 가지 우려 사항이 있습니다.HttpSessionListener - GC 고려 사항?

내 수신기에 세션에 대한 참조를 저장하고 sessionDestroyed에서 제거하는 멤버 변수 목록이있는 경우 -이 목록은 메모리 누수의 위험이 있습니다. 예를 들어 목록이 Tomcat의 내부 세션 추적과 동기화되지 않은 것처럼 GCed 수 있습니까?

웬일인지 이건 그냥 나쁜 생각처럼 보입니다. Tomcat이 내부 목록에 액세스하지 못하는 이유는 무엇입니까? 그것은 매우 유용 할 것입니다. 모든 통찰력은 인정 될 것이다.

+0

_It은 당신이 그것으로 무엇을 하시겠습니까 useful._ 매우 것입니까? –

+0

예를 들어, 나는 우리 애플리케이션이 Session 속성에 저장하는 동일한 (그리고 어떤) 사용자 토큰을 얼마나 많은 활성 세션이 사용하고 있는지 즉시 판단 할 수있다. – Black

답변

1

sessionCreated 및 sessionDestroyed를 구현하는 한 완전히 신뢰할 만합니다. 유일한 단점은 앱이 실행 중이 지 않거나 다시 시작할 때 Tomcat이 알고있는 활성 세션을 잃어 버릴 수 있지만 작성되었거나 삭제 된 알림을받지 못했다는 것을 본 적이 없다는 것입니다.

ConcurrentHashMap과 같은 동시성을 처리하는 세션 데이터를 저장하고 있는지 확인하십시오.

다음은 간단한 예제이다

public class SessionData implements HttpSessionListener { 
    private final static Map<String, HttpSession> activeSessions = new ConcurrentHashMap<>(); 

    @Override 
    public void sessionCreated(HttpSessionEvent se) { 
     HttpSession session = se.getSession(); 
     if (session != null) { 
      String id = session.getId(); 
      System.out.println("HTTP session created. ID: " + id); 
      activeSessions.put(id, session); 
     } 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
     HttpSession session = se.getSession(); 
     if (session != null) { 
      String id = session.getId(); 
      System.out.println("HTTP session destroyed. ID: " + id); 
      activeSessions.remove(id); 
     } 
    } 
}