我的问题是关于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集群用于存储会话嵌入?如果是这样,当会话存储在外部群集中时,是否有解决方案来实现类似的行为?
我会尝试添加一个地图侦听器,但我约98%确定它没有从地图中删除。我开始深入研究hazelcast-wm代码。它们的SessionListener在会话销毁时调用WebFilter.destroyOriginalSession。这最终调用WebFilter.destroySession,但传递invalidate参数为false。这最终会进入DeleteSessionEntryProcessor,并且它看起来像process过程方法只会在invalidate为true时移除映射条目。这绝对是可能的,我错过了一些东西,但我不明白这将如何删除地图条目。 – nolt2232
我在这里打开了一个关于这个的错误:https://github.com/hazelcast/hazelcast-wm/issues/48 – nolt2232