gpt4 book ai didi

java - 具有 Hazelcast session 复制功能的自定义 session 监听器

转载 作者:行者123 更新时间:2023-12-01 09:40:07 25 4
gpt4 key购买 nike

我为 session 复制配置了 Hazelcast:

<filter>
<filter-name>hazelcast-filter</filter-name>
<filter-class>com.hazelcast.web.WebFilter</filter-class>

<init-param>
<param-name>map-name</param-name>
<param-value>my-sessions</param-value>
</init-param>
<init-param>
<param-name>cookie-name</param-name>
<param-value>hazelcast.sessionId</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hazelcast-filter</filter-name>
<url-pattern>/</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<listener>
<listener-class>com.hazelcast.web.SessionListener</listener-class>
</listener>

在我的网络应用程序中,用户可以发出订单,该订单将在 session 中持续存在,直到完成为止。如果订单未完成并且 session 被破坏(用户注销或 session 过期),我想备份该订单处理的所有数据。

如果没有 Hz session 复制,我可以使用自定义 HttpSessionListener 实现来完成此操作,例如:

@Override
public void sessionDestroyed(HttpSessionEvent se) {
Order order = (Order) se.getSession().getAttribute("order");
if (order != null) {
// Backup all data processed by order
}
}

它工作正常,但使用 Hz 我得到 2 个不同步的不同 session :

switch (action) {
case "addOrderItems":
System.out.print("sesId=" + req.getSession().getId());
System.out.println("order=" + req.getSession().getAttribute("order"));

打印 sesId=HZDCDC1C77E7934E03A9FE329AAB7053B0 or​​der=Order@6a5f7445

同时

@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.print("sesId=" + se.getSession().getId());
System.out.println("order=" + se.getSession().getAttribute("order"));

打印 sesId=8748D170885C44B425FEEAA94AAB8A86 order=null

Hazelcast 似乎创建并销毁了它自己的 session ,而我无法(或不知道如何)监听此 session 事件。

是否可以保持两个 session 同步或实现您自己的 Hz session 监听器?

最佳答案

只需两步即可到达

如果您先创建一个 Hazelcast 实例,那么您可以将其名称作为参数传递,

<init-param>
<param-name>instance-name</param-name>
<param-value>whatever</param-value>
</init-param>

因此 session 复制将使用预先存在的 Hazelcast 实例,而不是生成一个新实例。

当您创建该实例时,您可以以正常方式将监听器附加到 session 存储映射。

<map name="my-sessions">
<entry-listeners>
<entry-listener local="true" include-value="true">your.entry.Listener</entry-listener>
</entry-listeners>
</map>

关于java - 具有 Hazelcast session 复制功能的自定义 session 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38530465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com