- PR -

セッション数を得たいのですが

1
投稿者投稿内容
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2002-12-05 01:01
初投稿です。よろしくお願いします。

現在開発中のWebアプリで、サーバーの負荷が課題になっていまして、
いったい何人のユーザーが同時にアクセスしているのかの情報を得たいと
思っているのですが、その方法が分かりません。

システム自体から得ることができるのでしょうか?そうであれば、そのコマンドは?

また、サーブレットのスレッドが実行されている数とかセッションの数などが得
られれば、わかるのではと思うのですが。そのための何か良い方法がある
でしょうか?

他にも良い方法があれば教えていただけませんでしょうか。

よろしくお願いします。



しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-12-05 04:41
昔は session 数を調べるインタフェースがあったようですが、セキュリティー上の理由でなくなったようです。

どうしても必要であれば、外部に uniq user を調べるような sniffer/proxy をたてるか、アプリの方に実装しましょう。

スレッド数などは、Java 用各種プロファイラを調べてみるとよいでしょう。会議室の過去ログにもある気がします。
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2002-12-05 10:43
しょむさんありがとうございます。

スレッドの数の取得についてですが、過去ログを検索してみましたが、
どれが該当するのか検討つきませんでした。まだまだ未熟者です。ご容赦ください。

APIも捜してみたのですが、ThreadGroupクラスにactiveCountメソッドなるものが
ありますが、これを使うのでしょうか?

もしそうであれば、これをどのようにサーブレットに実装すればよいのでしょうか?

サーブレット関連の開発では、このスレッドをちゃんと理解していないといけないの
でしょうが、まだまだ勉強不足ですみません。

よろしくお願いします。

ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2002-12-05 11:26
セッション数をアプリケーション的に取れるようにするなら、
サーブレットAPIのjavax.servlet.http.HttpSessionBindingListenerを実装して
その中で管理してあげるというのも手かなと。
具体的にはこんな感じでしょうか?

コード:

/** 現在アプリケーションに張られているセッションの数を管理するクラスです */
public class SessionCount {
	private static final SessionCount instance     = new SessionCount();
	private              int          sessionCount = 0;

	private SessionCount() {}

	public static SessionCount getInstance() {
		return( instance );
	}

	public void increment() { sessionCount++;}
	public void decrement() { sessionCount--;}

	public int getSessionCount() { return( sessionCount );}

}

/** セッションが新しく張られたり無効になったりした際に動作するリスナーです */
public class HttpSessionBindingListenerImple implements HttpSessionBindingListener {

    public void valueBound( HttpSessionBindingEvent e ){
        SessionCount.getInstance().increment();
    }

    public void valueUnbound( HttpSessionBindingEvent e ) {
        SessionCount.getInstance().decrement();
    }
}



もちろん現実に実装する際考慮に入れないといけないことは色々ありますが、
基本はこんな感じでセッション数はアプリケーション的に知ることができるかなと。
HttpSessionBindingListenerがセッションが新しくできたり無効になったりした際に
通知を受けて任意の処理を行うためのインターフェースになります。
詳しい使い方等はサーブレットAPIのJavadocを参照していただければよろしいかと。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-12-05 14:26
中込です。
HttpSessionBindingListenerに関し、補足の必要を感じました。
HttpSessionBindingListenerインタフェースは、セッションの作成や無効化に対応しているのではありません。
当該インタフェースを実装したオブジェクトの、セッションへの結びつき(bind)と切り離し(unbind)に対応しているのです。
要するに、
>/** セッションが新しく張られたり無効になったりした際に動作するリスナーです */
という記述は誤解を与える可能性があるということです。あたかも、セッションが新たに作成された時点で、HttpSessionBindingListenerを実装したオブジェクトのvalueBound()メソッドが呼び出されるかのような印象を与えます。

正確には、HttpSessionBindingListenerを実装したオブジェクトが、セッション(HttpSession)に
(setAttribute()で)結び付けられた時点で、当該オブジェクトのvalueBound()メソッドがよびだされるのです。
反対に、当該オブジェクトがセッションから切り離される(
removeAttribute()で切り離されるか、setAttribute()で他のオブジェクトが同一名で結び付けられるか、invalidate()やタイムアウトでセッションが無効化された)時点で、valueUnbound()メソッドが呼び出されます。

したがって、同一のコンテナ上にあるすべてのセッションに関して、それらが作成された直後に
HttpSessionBindingListenerを実装したオブジェクトを、セッションに結びつけ、セッションが
無効になるまで保持する(上書きしない)ようにコーディングすることが前提になります。

Servlet2.3仕様に準拠したServletコンテナーを利用されているのでしたら、
HttpSessionListenerインタフェースを利用されることをお勧めします。
このインタフェースはWebアプリケーションの、セッションの作成や無効化に対応しています。
sessionCreated()はセッションが作成されたことを通知します。
sessionDestroyed()はセッションが無効になったことを通知します。
ただし、イベントリスナ(当該インタフェースを実装したクラス)は、DD(web.xml)に<listener>として
定義しておく必要があリます。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-12-06 15:39
中込です。
参考までに、HttpSessionListenerインタフェースを利用して実装したと
思われるものに、Tomcat4.1のWeb Application Managerがあります。

http://www.nakagome.co.jp/temp/test/tomcat41manager.jpg
_________________
Paul K.Nakagome
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2002-12-06 18:34
引用:

Servlet2.3仕様に準拠したServletコンテナーを利用されているのでしたら、
HttpSessionListenerインタフェースを利用されることをお勧めします。
このインタフェースはWebアプリケーションの、セッションの作成や無効化に対応しています。
sessionCreated()はセッションが作成されたことを通知します。
sessionDestroyed()はセッションが無効になったことを通知します。
ただし、イベントリスナ(当該インタフェースを実装したクラス)は、DD(web.xml)に<listener>として
定義しておく必要があリます。



中込さん。良いアドバイスありがとうございました。
ご指摘いただいた"HttpSessionListener"インタフェースを使って下記のようなクラス
を作ってみたところ、ほぼ期待通りの結果を得ることができるようになりました。

import javax.servlet.http.*;

public final class SessionCount implements HttpSessionListener
{
    private static int count = 0;
//コンストラクタ
public void SessionCount()
{
}
//セッション生成
public void sessionCreated(HttpSessionEvent se)
{
count ++;
System.out.println("アクセス = " + count);
}
//セッション削除
public void sessionDestroyed(HttpSessionEvent se)
{
count --;
System.out.println("ログアウト = " + count);
}
//アクセスメソッド
public static int getSessionCount()
{
return count;
}
}

あと、Web.xmlのなかで<servlet>の定義の前に、以下の記述を追加すれば使えました。 <listener>
<listener-class>myrec.SessionCount</listener-class>
</listener>
これで、Webアプリにアクセスがあるとかうんとアップし、セッションが切れるとカウント
ダウンしてくれていますので、現時点でいくつのセッションが存在しているかわかるよう
になりました。

ありがとうございました。



1

スキルアップ/キャリアアップ(JOB@IT)