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 段階の選択カスケードを実装します。

推薦する

Mybatisの各SQL文の実行時間の統計

背景最近、面接でデータベース トランザクションについてよく質問されます。通常は、@Transacti...

英語の単語の出現頻度を数えるtrコマンドの魔法

置換を削除したり文字列を削除したりできる tr コマンドは、誰もがよく知っています。 英語では、英語...

高品質なJavaScriptコードの書き方

目次1. 読みやすいコード1. 統一コード形式2. マジックナンバーを削除する3. 単一機能原則2....

Linux で Docker を使用して MySQL をインストールする手順

テスターとして、学習プロセス中に Linux でソフトウェアをインストールする必要が頻繁にある場合が...

ポップアップ効果を実現するにはjsを使用します

この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...

MySQL カーソル関数と使用法

目次意味カーソルの役割カーソルの使用カーソルの宣言カーソルを開くカーソルデータのトラバースカーソルを...

ネイティブ js カプセル化シームレスカルーセル機能

ネイティブjsカプセル化シームレスカルーセルプラグイン、参考までに、具体的な内容は次のとおりです。例...

Nginxはリバースプロキシを使用して負荷分散プロセス分析を実装します

導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...

純粋な CSS カスタム複数行省略記号の問題 (原理から実装まで)

テキストオーバーフローを表示するにはどうすればいいですか? どのようなニーズがありますか?単一行です...

Mysql5.7 で JSON 操作関数を使用する手順

序文JSON は、言語に依存しないテキスト形式を使用する軽量のデータ交換形式で、XML に似ています...

Mysql データベース ストアド プロシージャの基本構文の説明

プロシージャ sp_name を削除します//これまで、MYSQL 構文の基礎知識について説明して...

Hadoopカウンターとデータクリーニングの適用

データクリーニング (ETL)コアビジネスの MapReduce プログラムを実行する前に、まずデー...

MySQL 検査スクリプト (必読)

以下のように表示されます。 #!/usr/bin/env python3.5 psutilをインポー...

MySQL ストレージエンジン InnoDB の設定と使用方法の説明

MyISAM と InnoDB は、MySQL で最も一般的なストレージ エンジンです。前回の記事で...