【发布时间】:2017-04-04 21:05:36
【问题描述】:
我的问题是关于 Hazelcast 如何从底层地图中删除过期会话。
我在 Tomcat 上运行一个大型 Java Web 应用程序,它使用基于 cookie 的会话。请求通过 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 小时)。 Hazelcast 地图名为 SessionMap,其 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 集群?如果是这样,当会话存储在外部集群中时,是否有实现类似行为的解决方案?
【问题讨论】: