HttpSessionListener - GC注意事项?

时间:2015-01-27 01:23:00

标签: java tomcat

Tomcat没有用于访问活动会话集合的API,所以我想为我的WebApp设计一个HttpSessionListener,但我对实现有一些担忧。

如果我的监听器有一个成员变量List,它存储对Sessions本身的引用并在sessionDestroyed上删除它们 - 这是否会导致内存泄漏,就像该列表与Tomcat不同步一样内部跟踪会话,他们将无法成为GC?

出于某种原因,这似乎是一个坏主意,我想知道为什么Tomcat不能访问它的内部列表?这将非常有用。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我发现只要你实现了sessionCreated和sessionDestroyed,它就完全可靠了。唯一的缺点是你将失去Tomcat知道你的应用程序是否运行或重启的活动会话,但我从来没有看到它错过了获取创建或销毁的通知。< / p>

确保将会话数据存储在处理并发的内容中,如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);
        }
    }
}