Как узнать, какие открытые сессии обрабатывает мое приложение на основе сервлетов в любой момент - PullRequest
5 голосов
/ 22 января 2010

Мне нужно написать сервлет, который при вызове получает информацию о списке открытых в данный момент сеансов.

Есть ли способ сделать это?

Ответы [ 2 ]

7 голосов
/ 22 января 2010

Реализуйте HttpSessionListener, присвойте ему свойство static Set<HttpSession>, добавьте к нему сеанс во время метода sessionCreated(), удалите сеанс из него во время метода sessionDestroyed(), зарегистрируйте слушателя как <listener> в web.xml. Теперь у вас есть класс, в котором собраны все открытые сессии в текущем экземпляре JBoss. Вот базовый пример:

public HttpSessionCollector implements HttpSessionListener {
    private static final Set<HttpSession> sessions = ConcurrentHashMap.newKeySet();

    public void sessionCreated(HttpSessionEvent event) {
        sessions.add(event.getSession());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession());
    }

    public static Set<HttpSession> getSessions() {
        return sessions;
    }
}

Тогда в вашем сервлете просто выполните:

Set<HttpSession> sessions = HttpSessionCollector.getSessions();

Если вы хотите сохранить / получить его в области приложения, чтобы можно было сделать Set<HttpSession> нестатичным , тогда позвольте HttpSessionCollector реализовать ServletContextListener , а также и добавьте в основном следующие методы:

public void contextCreated(ServletContextEvent event) {
    event.getServletContext().setAttribute("HttpSessionCollector.instance", this);
}

public static HttpSessionCollector getCurrentInstance(ServletContext context) {
    return (HttpSessionCollector) context.getAttribute("HttpSessionCollector.instance");
}

, который вы можете использовать в сервлете следующим образом:

HttpSessionCollector collector = HttpSessionCollector.getCurrentInstance(getServletContext());
Set<HttpSession> sessions = collector.getSessions();
3 голосов
/ 26 января 2010

Возможно, использование компонента JMX более элегантно и не требует кода. Просто прочитайте значение

данные: jboss.web: тип = менеджер, путь = / myapplication, хост = localhost "активные сессии

...