Exemplo HttpSessionListener - Monitoramento
*1. Visão geral *
Este tutorial mostrará como* registrar um javax.servlet.http.HttpSessionListener *e rastrear o número de sessões ativas no aplicativo da Web usando metrics.
===* 2. Definindo o Ouvinte *
*Podemos registrar o ouvinte de sessão HTTP no _web.xml _:*
<web-app ...>
<listener>
<listener-class>org..web.SessionListenerWithMetrics</listener-class>
</listener>
</web-app>
Como alternativa, em um ambiente do Servlet 3, podemos usar o _ @ WebListener_ para registrar o ouvinte também. Nesse caso, precisamos anotar a classe SpringBootApplication principal com https://www..com/spring-servletcomponentscan [@ServletComponentScan] .
Por fim, também podemos registrar o ouvinte usando a configuração Java *declarando um bean ServletListenerRegistrationBean:
@Bean
public ServletListenerRegistrationBean<SessionListenerWithMetrics> sessionListenerWithMetrics() {
ServletListenerRegistrationBean<SessionListenerWithMetrics> listenerRegBean =
new ServletListenerRegistrationBean<>();
listenerRegBean.setListener(new SessionListenerWithMetrics());
return listenerRegBean;
}
===* 3. O ouvinte básico *
O ouvinte simples* manterá o controle do número de sessões ativas *o tempo todo:
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();
}
}
O ouvinte da sessão será acionado quando a sessão for criada - sessionCreated:
HttpSession session = request.getSession();
E destruído - sessionDestroyed:
session.invalidate();
Esse mecanismo permite que a contagem de sessões atual seja recuperada do ouvinte, mas, para ter* monitoramento e transparência em tempo real *, precisamos de lógica adicional para recuperar o valor e publicá-lo.
É aqui que entra a biblioteca de métricas - vem com vários repórteres prontos para uso que permitem que essa métrica seja publicada com muito pouco esforço.
*4. O ouvinte com métricas *
Portanto, em vez de lançar nossa própria solução de monitoramento personalizado, aproveitaremos* a biblioteca de métricas *; precisamos adicioná-lo ao nosso pom:
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.0.1</version>
</dependency>
Com o núcleo de métricas disponível no caminho de classe, podemos escrever o mesmo HttpSessionListener usando um objeto 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();
}
}
O MetricRegistry - o registro central de todas as métricas de aplicativos - é simplesmente referenciado em um campo estático amplo do aplicativo:
public final class MetricRegistrySingleton {
public static final MetricRegistry metrics = new MetricRegistry();
}
A publicação dessa métrica e a disponibilidade imediata para o monitoramento - por exemplo, no sistema de registro padrão do aplicativo - são simples:
Logger logger = LoggerFactory.getLogger("org..monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);
5. Conclusão
Este tutorial ilustrou como registrar um HttpSessionListener no descritor de implementação do aplicativo Web e como monitorar o número ativo de sessões usando dois mecanismos. O primeiro mecanismo é um contador feito à mão e o segundo é baseado na biblioteca metrics madura.
A implementação pode ser encontrada em o exemplo de projeto do github.