HttpSessionListenerの例 – 監視
1概要
このチュートリアルでは、
web.xml
に
javax.servlet.http.HttpSessionListener
を
登録し、Webアプリケーションでアクティブなセッションの数をhttp://metrics.codahale.com/[metrics]を使用して追跡する方法を示します。
2
web.xml
のリスナー
HTTPセッションリスナは
web.xml
に登録できます。
<web-app ...>
<listener>
<listener-class>org.baeldung.web.SessionListenerWithMetrics</listener-class>
</listener>
</web-app>
あるいは、サーブレット3環境では、
@ WebListener
を使用してリスナーを登録することもできます。
3基本リスナー
単純なリスナーは常に
アクティブなセッションの数を追跡
します。
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
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();
このメカニズムにより、現在のセッション数をリスナーから取得することができますが、
リアルタイムの監視と透過性
を得るには、実際に値を取得して公開するための追加ロジックが必要です。
これがメトリックライブラリが登場するところです – それはこのメトリックが非常に少ない努力で公表されることを可能にするhttp://metrics.codahale.com/manual/core/#reporters[すぐに使えるレポーター]が付属しています。
4メトリックスを持つリスナー
そのため、独自のカスタム監視ソリューションを展開する代わりに、
メトリックスライブラリ
を活用します。 Pomに追加する必要があります。
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.0.1</version>
</dependency>
メトリクスコアがクラスパスで利用可能なので、
Counter
オブジェクトを使って同じ
HttpSessionListener
を書くことができます。
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.codahale.metrics.Counter;
import com.codahale.metrics.MetricRegistry;
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
– すべてのアプリケーションメトリックの中心的なレジストリ – は、アプリケーション全体の静的フィールドで単純に参照されます。
import com.codahale.metrics.MetricRegistry;
public final class MetricRegistrySingleton {
public static final MetricRegistry metrics = new MetricRegistry();
}
このメトリックを公開し、それを監視できるようにすること(たとえば、アプリケーションの標準的なロギングシステムなど)を簡単に利用できるようにすることは簡単です。
Logger logger = LoggerFactory.getLogger("org.baeldung.monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);
5結論
このチュートリアルでは、Webアプリケーションのデプロイメント記述子に
HttpSessionListener
を登録する方法と、2つのメカニズムを使用してアクティブセッション数を監視する方法について説明しました。最初のメカニズムはハンドロールカウンターで、2番目のメカニズムは成熟した
metrics
ライブラリーに基づいています。
実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-session#readme[githubプロジェクトの例]にあります – これはEclipseベースのプロジェクトなので簡単です。そのままインポートして実行します。
プロジェクトがローカルで実行されている場合、
login.html
にはhttp://localhost:8080/spring-security-mvc-session/login.html[localhost]でアクセスできます。