2017-04-04 17 views
1

私の質問は、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クラスタが埋め込まれている場合にのみ適用されますか?その場合、セッションが外部クラスタに格納されているときに同様の動作を実現するソリューションはありますか?

答えて

3

あなたが言及した設定は正しいと思われます。 SessionListenerは、2時間後に期限切れのセッションを削除する必要があり、マップのttlは12時間後にエントリを失効させる必要があります。クライアント/サーバモードに影響しないので、をweb.xmlのinit-paramから削除できます。

期限切れセッションがマップから削除されているかどうかを確認するには、軽量のMapEventListenerを実装できます。

IMap map = hzInstance.getMap("sesssion-map"); 
map.addEntryListener(new SessionMapEntryListener(), false); 

MapEntryリスナーを実装します。必要に応じて他のインタフェースも実装できます。たとえば、EntryAddedListener, EntryRemovedListener, EntryUpdatedListener, EntryEvictedListener

private static class SessionMapEntryListener implements MapListener, EntryExpiredListener { 

    @Override 
    public void entryExpired(EntryEvent entryEvent) { 
     System.out.println("EntryExpiredEvent triggered. Expired Entry = " + entryEvent.getKey()); 
    } 
} 
+0

私はまもなくマップリスナーを追加しようとしますが、マップから削除されないことを約98%確信しています。私はhazelcast-wmコードを掘り始めました。 SessionListenerは、セッションが破棄されたときにWebFilter.destroyOriginalSessionを呼び出します。これによりWebFilter.destroySessionが呼び出されますが、invalidate引数にfalseが渡されます。これは最終的にDeleteSessionEntryProcessorに入り、invalidateがtrueの場合にのみprocessメソッドがマップエントリを削除するように見えます。間違いなく私は何かが欠落している可能性がありますが、マップエントリを削除する方法がわかりません。 – nolt2232

+0

私はここでこれに関するバグをオープンしました:https://github.com/hazelcast/hazelcast-wm/issues/48 – nolt2232

関連する問題