2017-04-04 33 views
1

我的问题是关于Hazelcast如何从底层地图中删除过期的会话。Hazelcast - 从地图中删除过期的会话

我在使用基于Cookie的会话的Tomcat上运行大型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集群用于存储会话嵌入?如果是这样,当会话存储在外部群集中时,是否有解决方案来实现类似的行为?

回答

3

无论您提到的设置是什么,都是正确的。 SessionListener应该在2小时后处理过期的会话,地图的ttl应该在12小时后处理过期的时间。您可以从web.xml的init-param中删除session-ttl-seconds,因为它对客户端/服务器模式没有影响。

要确认过期会话是否从地图中删除,可以实现轻量级MapEventListener。

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

实现MapEntry Listener。您可以根据需要实现其他接口。例如,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,并且它看起来像process过程方法只会在invalidate为true时移除映射条目。这绝对是可能的,我错过了一些东西,但我不明白这将如何删除地图条目。 – nolt2232

+0

我在这里打开了一个关于这个的错误:https://github.com/hazelcast/hazelcast-wm/issues/48 – nolt2232