Esempio di HttpSessionListener: monitoraggio

1. Panoramica

Questo tutorial mostrerà come registrare un javax.servlet.http.HttpSessionListener e tenere traccia del numero di sessioni attive nell'applicazione Web utilizzando le metriche.

2. Definizione dell'ascoltatore

Possiamo registrare il listener della sessione HTTP in web.xml :

  com.baeldung.web.SessionListenerWithMetrics  

In alternativa, in un ambiente Servlet 3, possiamo usare @WebListener per registrare anche l'ascoltatore. In questo caso, dobbiamo annotare la classe SpringBootApplication principale con @ServletComponentScan.

Infine, possiamo anche registrare il listener utilizzando la configurazione Java dichiarando un bean ServletListenerRegistrationBean :

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

3. L'ascoltatore di base

Il semplice ascoltatore terrà sempre traccia del numero di sessioni attive :

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(); } }

Il listener della sessione verrà attivato quando la sessione viene creata - sessionCreated :

HttpSession session = request.getSession();

E distrutto - sessionDestroyed :

session.invalidate();

Questo meccanismo consente di recuperare il conteggio della sessione corrente dall'ascoltatore, ma per avere il monitoraggio e la trasparenza in tempo reale , abbiamo bisogno di logica aggiuntiva per recuperare effettivamente il valore e pubblicarlo.

È qui che entra in gioco la libreria delle metriche: viene fornita con diversi reporter pronti all'uso che consentono di pubblicare questa metrica con il minimo sforzo.

4. L'ascoltatore con le metriche

Quindi, invece di implementare la nostra soluzione di monitoraggio personalizzata, faremo leva sulla libreria di metriche ; dovremo aggiungerlo al nostro pom:

 com.codahale.metrics metrics-core 3.0.1 

Con metrics core è disponibile sul classpath, possiamo scrivere lo stesso HttpSessionListener utilizzando un oggetto 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(); } }

Il MetricRegistry , il registro centrale di tutte le metriche dell'applicazione, è semplicemente referenziato in un campo statico a livello di applicazione:

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

Pubblicare questa metrica e renderla immediatamente disponibile per essere monitorata, ad esempio per il sistema di registrazione standard dell'applicazione, è semplice:

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. conclusione

Questo tutorial ha illustrato come registrare un HttpSessionListener nel descrittore di distribuzione dell'applicazione Web e come monitorare il numero di sessioni attive utilizzando due meccanismi. Il primo meccanismo è un contatore a rotazione manuale e il secondo si basa sulla libreria di metriche mature .

L'implementazione può essere trovata nel progetto GitHub di esempio.