1. 개요
이 예제은 어떻게 javax.servlet.http.HttpSessionListener 를 등록하고 메트릭 을 사용하여 웹 애플리케이션의 활성 세션 수를 추적 하는지 보여줄 것 입니다.
2. 리스너 정의하기
web.xml 에 HTTP 세션 수신기를 등록할 수 있습니다 .
<web-app ...>
<listener>
<listener-class>com.baeldung.web.SessionListenerWithMetrics</listener-class>
</listener>
</web-app>
또는 Servlet 3 환경 에서 @WebListener 를 사용 하여 리스너도 등록할 수 있습니다. 이 경우 @ServletComponentScan 으로 기본 SpringBootApplication 클래스 에 어노테이션을 달아야 합니다.
마지막으로 ServletListenerRegistrationBean 빈 을 선언 하여 Java 구성을 사용하여 수신기를 등록할 수도 있습니다 .
@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>
메트릭 코어를 클래스 경로에서 사용할 수 있으므로 Counter 개체 를 사용하여 동일한 HttpSessionListener 를 작성할 수 있습니다.
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 프로젝트 에서 찾을 수 있습니다 .