私の質問は、Hazelcastが期限切れのセッションを元のマップから削除する方法に関するものです。Hazelcast - マップから期限切れのセッションを削除します
TomcatでCookieベースのセッションを使用する大規模なJava Webアプリケーションを実行しています。リクエストはHazelcastのWebFilterを経由します。 WebFilterは外部のHazelcastクラスタに接続し、セッションをマップに保存するように設定されています。以下に、web.xmlフィルタ設定のサブセットを示します。 web.xmlで
<init-param> <param-name>use-client</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>map-name</param-name> <param-value>SessionMap</param-value> </init-param>
、私session-timeout
120(すなわち2時間)に設定されています。 SessionMapというHazelcastマップのTTLは24時間です。ここでは、2時間非アクティブなセッションを終了したいと考えていますが、誰かが継続的にアプリケーションを使用している場合、セッションを最大24時間継続させたいと考えています。
セッションをアイドル状態にしておくと、Tomcatは2時間後にセッションを終了しますが、セッションはTTLまでHazelcastマップ(SessionMap)に残ります。 Tomcatで期限切れになったHazelcastが、元のマップからセッションを自動的に削除する方法はありますか?
アプリケーションには多数のセッションが存在する可能性があり、24時間にわたってアクティブな状態がほとんど維持されることはほとんどありません。そのため、Hazelcastのメモリにすでに有効期限が切れているセッションは残したくありません。
私はHazelcast 3.8を使用しています。 Hazelcastのドキュメント(http://docs.hazelcast.org/docs/3.5/manual/html/websessionreplication.html)で
EDIT、それは言う:セッションがWebコンテナ上で有効期限が切れている場合
Hazelcastは自動的にクラスタからセッションを削除します。この削除は、javax.servlet.http.HttpSessionListenerの実装であるcom.hazelcast.web.SessionListenerによって行われます。
これは、セッションの保存に使用されているHazelcastクラスタが埋め込まれている場合にのみ適用されますか?その場合、セッションが外部クラスタに格納されているときに同様の動作を実現するソリューションはありますか?
私はまもなくマップリスナーを追加しようとしますが、マップから削除されないことを約98%確信しています。私はhazelcast-wmコードを掘り始めました。 SessionListenerは、セッションが破棄されたときにWebFilter.destroyOriginalSessionを呼び出します。これによりWebFilter.destroySessionが呼び出されますが、invalidate引数にfalseが渡されます。これは最終的にDeleteSessionEntryProcessorに入り、invalidateがtrueの場合にのみprocessメソッドがマップエントリを削除するように見えます。間違いなく私は何かが欠落している可能性がありますが、マップエントリを削除する方法がわかりません。 – nolt2232
私はここでこれに関するバグをオープンしました:https://github.com/hazelcast/hazelcast-wm/issues/48 – nolt2232