«1. Обзор

В этом руководстве показано, как зарегистрировать javax.servlet.http.HttpSessionListener и отслеживать количество активных сеансов в веб-приложении с помощью метрик.

2. Определение прослушивателя

Мы можем зарегистрировать прослушиватель сеанса HTTP в файле web.xml:

<web-app ...>
    <listener>
        <listener-class>com.baeldung.web.SessionListenerWithMetrics</listener-class>
    </listener>
</web-app>

Кроме того, в среде Servlet 3 мы также можем использовать @WebListener для регистрации прослушивателя. . В этом случае нам нужно аннотировать основной класс SpringBootApplication с помощью @ServletComponentScan.

Наконец, мы также можем зарегистрировать прослушиватель с помощью конфигурации Java, объявив bean-компонент ServletListenerRegistrationBean:

@Bean
public ServletListenerRegistrationBean<SessionListenerWithMetrics> sessionListenerWithMetrics() {
   ServletListenerRegistrationBean<SessionListenerWithMetrics> listenerRegBean =
     new ServletListenerRegistrationBean<>();
   
   listenerRegBean.setListener(new SessionListenerWithMetrics());
   return listenerRegBean;
}

3. Базовый прослушиватель

Простой прослушиватель будет постоянно отслеживать количество активных сеансов:

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final AtomicInteger activeSessions;

    public SessionListenerWithMetrics() {
        super();

        activeSessions = new AtomicInteger();
    }

    public int getTotalActiveSession() {
        return activeSessions.get();
    }

    public void sessionCreated(final HttpSessionEvent event) {
        activeSessions.incrementAndGet();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        activeSessions.decrementAndGet();
    }
}

Прослушиватель сеанса будет запущен при создании сеанса – sessionCreated:

HttpSession session = request.getSession();

И уничтожен – sessionDestroyed:

session.invalidate();

Этот механизм позволяет извлекается из прослушивателя, но для мониторинга и прозрачности в реальном времени нам нужна дополнительная логика для фактического извлечения значения и его публикации.

Здесь на помощь приходит библиотека метрик — она поставляется с несколькими готовыми генераторами отчетов, которые позволяют опубликовать эту метрику с минимальными усилиями.

4. Слушатель с метриками

Итак, вместо развертывания собственного решения для мониторинга мы будем использовать библиотеку метрик; нам нужно добавить его в наш pom:

<dependency>
    <groupId>com.codahale.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>3.0.1</version>
</dependency>

Поскольку ядро ​​метрик доступно в пути к классам, мы можем написать тот же HttpSessionListener, используя объект Counter:

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final Counter counterOfActiveSessions;

    public SessionListenerWithMetrics() {
        super();
        counterOfActiveSessions = MetricRegistrySingleton.metrics.counter("web.sessions.active.count");
    }

    public void sessionCreated(final HttpSessionEvent event) {
        counterOfActiveSessions.inc();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        counterOfActiveSessions.dec();
    }
}

MetricRegistry — центральный реестр всех метрик приложения — просто ссылается на статическое поле приложения:

public final class MetricRegistrySingleton {
    public static final MetricRegistry metrics = new MetricRegistry();
}

Публикация этой метрики и обеспечение ее легкого доступа для мониторинга — например, в стандартной системе ведения журнала приложения — “ прост:

Logger logger = LoggerFactory.getLogger("com.baeldung.monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
  convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);

5. Заключение

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

Реализацию можно найти в примере проекта GitHub.