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]でアクセスできます。