セッション レプリケーション用に 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>
私の Web アプリケーションでは、ユーザーは、終了するまでセッションに保持される Order を作成できます。注文が完了せず、セッションが破棄された (ユーザーがログアウトしたか、セッションが期限切れになった) 場合に備えて、その注文によって処理されたすべてのデータをバックアップしたいと考えています。
Hz セッション レプリケーションを使用しない場合、次のようなカスタム 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 つの異なるセッションが取得されます。
switch (action) {
case "addOrderItems":
System.out.print("sesId=" + req.getSession().getId());
System.out.println("order=" + req.getSession().getAttribute("order"));
版画sesId=HZDCDC1C77E7934E03A9FE329AAB7053B0 order=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 は独自のセッションを作成および破棄しているようで、このセッション イベントをリッスンできません (または、リッスンする方法がわかりません)。
両方のセッションを同期させたり、Hz セッション用に独自のリスナーを実装したりすることはできますか?