Tomcat でタイムアウトしたセッションを監視および削除する方法

Tomcat でタイムアウトしたセッションを監視および削除する方法

序文

偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効であることを意味するのではなく、30 分間アイドル状態になるとセッションが削除されることを意味することを発見しました。ソースコードをざっと見てみました。少し整理整頓しました。

注:アイドル時間とは、同じセッション内の 2 つのリクエスト間の間隔を指します。

セッション関連のクラス図


  • HttpSession は、サーブレット層で直接使用できるセッションです。
  • セッションはTomcatが内部的に使用するインターフェースであり、いくつかの内部呼び出しを実行できる。
  • StandardSession は標準の HttpSession 実装です。また、Tomcat の内部管理用の Session インターフェイスも実装します。
  • StandardSessionFacade は、クラス名からすでに「ファサード クラス」であることが示されています。このクラスは、内部的には StandardSession オブジェクトを参照しますが、外部に対しては HttpSession によって指定されたメソッドのみを提供します。

マネージャー関連クラス図


StandardManager と PersitentManager はどちらも Manager の実装ですが、Session オブジェクトを保存する方法が異なります。

スタンダードマネージャー

1. Tomcatが動作しているとき、セッションはメモリに保存されます

2. Tomcat がシャットダウンすると (突然のクラッシュではなく、通常のシャットダウン操作であることに注意してください)、セッションはディスクに書き込まれ、Tomcat の再起動後に再度ロードされます。

永続マネージャー

1. セッションは常にディスクに保存します。

マネージャーとコンテキストの関係

Tomcat では、コンテキストは Tomcat にデプロイされたアプリケーション (Webapp) です。各コンテキストには、アプリケーションのセッション情報を管理するための個別の Manager オブジェクトがあります。

マネージャーがセッションを保存する方法

Managerオブジェクトは、セッションオブジェクトを保存するためにMapを使用します。

  • キー => セッションID
  • 値 => セッションオブジェクト
 /**
  * このマネージャーの現在アクティブなセッションのセット。キーは
  * セッション識別子。
  */
 保護された Map<String, Session> sessions = 新しい ConcurrentHashMap<>();

リクエストがコンテキストに到着すると、リクエストに JSESSIONID Cookie が含まれている場合、マネージャーは関連付けられたセッション オブジェクトを見つけて、それをリクエスト オブジェクトに格納できます。

管理者の定期検査

Manager インターフェイスには backgroundProcess() メソッドがあり、これは名前が示すようにバックグラウンド処理です。

/**
  * このメソッドは、定期的にコンテキスト/コンテナによって呼び出されます。
  * ベースで、マネージャーが実装できるようにします
  * セッションの期限切れなどの定期的なタスクを実行するメソッド。
  */
 パブリック void backgroundProcess();

注: Container インターフェイスにもこのメソッドがあります。このメソッドは通常、コンテナーの起動時に backgroundProcess メソッドを実行するための追加のスレッドを開始します。 Context のこのメソッドが開始されると、Loader と Manager の backgroundProcess メソッドが実行されます。

このメソッドが何をするのか見てみましょう。

/**
 * {@inheritDoc}
 * <p>
 * {@link #processExpires()} への直接呼び出し
 */
@オーバーライド
パブリック void backgroundProcess() {
 カウント = (カウント + 1) % プロセス有効期限頻度;
 if (count == 0) // チェック頻度に達したら、チェックを開始します processExpires();
}

/**
 * 期限切れのセッションをすべて無効にします。
 */
パブリックボイドプロセス期限切れ() {

 長いtimeNow = System.currentTimeMillis();
 セッション sessions[] = findSessions(); //すべてのセッションオブジェクトを取得します int expireHere = 0 ; //期限切れのセッションの数。この変数名に惑わされないでください if(log.isDebugEnabled())
  log.debug("" + getName() + " の期限切れセッションを " + timeNow + " sessioncount " + sessions.length に開始します);
 (int i = 0; i < sessions.length; i++) {
  セッション[i]がnullの場合、セッション[i].isValid()がtrueになります。
   ここで期限切れ++;
  }
 }
 長いtimeEnd = System.currentTimeMillis();
 if(log.isDebugEnabled()) //レコードを印刷 log.debug("期限切れセッションの終了 " + getName() + " processingTime " + (timeEnd - timeNow) + " 期限切れセッション: " + expireHere);
 処理時間 += ( 終了時間 - 現在時間 );

}

これを見て私と同じ疑問を抱く人も多いと思いますが、セッションを期限切れにする操作はなく、ステータスチェックのみ行われているようです。しかし、後で Session の isValid メソッドの実装を見て、すべて理解できました。

/**
 * このセッションの <code>isValid</code> フラグを返します。
 */
@オーバーライド
パブリックブール値isValid() {

 (これが有効である場合){
  false を返します。
 }

 if (this.expiring) {
  true を返します。
 }

 ACTIVITY_CHECK && accessCount.get() > 0 の場合 {
  true を返します。
 }

 //キーポイント //最大アイドル時間が設定されている場合は、 //このセッションのアイドル時間を取得して判断します //タイムアウトした場合は、expire操作を実行します if (maxInactiveInterval > 0) { 
  内部IdleTimeInternal() は、内部IdleTimeInternal() の次の値を返します。
  (timeIdle >= maxInactiveInterval)の場合{
   有効期限が切れます(true);
  }
 }

 this.isValid を返します。
}

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Java 開発におけるパフォーマンス分析に JVisualVM を使用する方法
  • LambdaProbe を使用して Tomcat を監視する方法
  • Tomcat 経由で JMX 監視を有効にする方法
  • Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル
  • Linux でシェル スクリプトを使用して Tomcat の状態を監視し、自動的に起動する手順
  • Python スクリプトによる Tomcat サーバー監視方法
  • Java 仮想マシンは jvisualvm ツールを使用して Tomcat メモリをリモートで監視します。

<<:  MYSQLクエリデータの結果に自動的に番号を付ける方法

>>:  js は、州、市、地区の 3 段階の選択カスケードを実装します。

推薦する

ウェブサイトアイコンを追加するにはどうすればいいですか?

最初のステップは、アイコン作成ソフトウェアを準備することです。まず、いわゆるアイコンは拡張子 .ic...

トップに戻るボタンを実装するJavaScript

この記事では、トップに戻るボタンを実装するためのJavaScriptの具体的なコードを参考までに紹介...

MySQLにおけるSQLの実行順序についてのちょっとした質問

今日、仕事中に左結合に関するSQLの問題に遭遇しました。後で解決しましたが、この問題を通じてSQLの...

MySQL サーバー 5.5 の接続失敗の解決策

mysqlに接続できない問題の解決方法を参考までに紹介します。具体的な内容は以下のとおりです。昨日は...

Linux の操作とメンテナンスの基本的なスワップ パーティションと LVM 管理のチュートリアル

目次1. スワップパーティション SWAP 1.1 スワップファイルを作成する1.2 スワップパーテ...

MySQL シリーズ 3 基礎

目次チュートリアルシリーズ1. MySQL の紹介2. MySQLの開発履歴3. MariaDBの基...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

HTML+JS に基づくシンプルな年齢計算ツールの実装

目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...

Vueでルーティング権限を動的に設定する主なアイデア

以前、インターネット上で動的ルーティング設定をいくつか見たことがありましたが、現在のプロジェクトとは...

MySQL データベース テーブルのパーティション分割に関する考慮事項 [推奨]

テーブル パーティショニングは、データベース パーティショニングとは異なります。では、テーブル パー...

Linuxはiptablesを使用して複数のIPからのサーバーへのアクセスを制限します

序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...

JavaScript の非同期処理で待機時間を節約できますか?

JavaScriptで非同期実行の結果を同期的に取得するには、 for ループ内でawaitを使用...

imgタグ間のスペースの問題の詳細な説明

IMG タグの基本分析 HTML5 では、img タグには 4 つの要素があります。 (1) src...

CSS flex 複数列レイアウト

基本的な3列レイアウト 。容器{ ディスプレイ: フレックス; 幅: 500ピクセル; 高さ: 20...

MySQL 文字列分割の例 (区切り文字なしの文字列抽出)

区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...