簡體   English   中英

Hazelcast - 從地圖中刪除過期的會話

[英]Hazelcast - Remove expired session from map

我的問題是關於Hazelcast如何從底層地圖中刪除過期的會話。

我在Tomcat上運行一個使用基於cookie的會話的大型Java Web應用程序。 請求通過Hazelcast的WebFilter進行。 WebFilter配置為連接到外部Hazelcast群集並在地圖中存儲會話。 這是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>

在web.xml中,我的session-timeout設置為120(即2小時)。 名為SessionMap的Hazelcast地圖的TTL為24小時。 這里的想法是我們希望結束2小時不活動的會話,但如果有人持續使用該應用程序,我們希望讓會話最多持續24小時。

問題是,如果我將會話空閑,Tomcat將在2小時后終止會話,但會話仍將保留在Hazelcast映射(SessionMap)中,直到TTL。 有沒有辦法讓Hazelcast在Tomcat中過期時自動從底層地圖中刪除會話?

該應用程序可以有大量的會話,很少有人會在整個24小時內保持活動狀態,因此我們不希望在Hazelcast的內存中保留已經過期的會話。

我正在使用Hazelcast 3.8。

編輯在Hazelcast文檔( http://docs.hazelcast.org/docs/3.5/manual/html/websessionreplication.html )中,它說:

如果Web容器上的會話已過期,Hazelcast會自動從群集中刪除會話。 此刪除由com.hazelcast.web.SessionListener完成,該實現是javax.servlet.http.HttpSessionListener。

這是否僅適用於嵌入用於存儲會話的Hazelcast群集? 如果是這樣,當會話存儲在外部集群中時,是否存在實現類似行為的解決方案?

無論你提到的設置是什么,都是正確的。 SessionListener應該負責在2小時后刪除過期的會話,並且地圖的ttl應該在12小時后處理該條目到期。 您可以從web.xml的init-param中刪除session-ttl-seconds ,因為它對Client / Server模式沒有影響。

要確認是否正在從地圖中刪除過期的會話,您可以實現輕量級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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM