0

セッション レプリケーション用に 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 セッション用に独自のリスナーを実装したりすることはできますか?

4

2 に答える 2

1

2つのステップでそこにたどり着くはずです

最初に Hazelcast インスタンスを作成する場合は、その名前をパラメーターとして渡すことができます。

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

そのため、セッション レプリケーションは、新しいインスタンスを生成するのではなく、既存の Hazelcast インスタンスを使用します。

そのインスタンスを作成すると、通常の方法でリスナーをセッション ストレージ マップにアタッチできます。

<map name="my-sessions">
  <entry-listeners>
    <entry-listener local="true" include-value="true">your.entry.Listener</entry-listener>
  </entry-listeners>
</map>
于 2016-07-25T20:07:49.050 に答える
0

Neil Stevenson が述べたように、Hazelcast インスタンスはEntryListenerfor my-sessionsmap で事前構成する必要があります。私の場合のようにセッションレプリケーションのフィルターを使用して、追加しました

<map name="my-sessions">
  <entry-listeners>
    <entry-listener local="true" include-value="true">path.to.NewOrderSessionListener</entry-listener>
    </entry-listeners>
</map>

hazelcast.xml適切な場所にあります)。

EntryRemovedListener<String, SessionState>Hzセッション削除イベントをリッスンする実装は次のようになります

public class NewOrderSessionListener implements EntryRemovedListener<String, SessionState> {
  @Override
  public void entryRemoved(EntryEvent<String, SessionState> event) {
    SessionState state = event.getOldValue();
    Map<String, Data> map = state.getAttributes();
    Data orderData = map.get("order");
    if (orderData != null) {
      // Backup all data processed by order
    }

実際、Hazelcastはあらゆるイベントのソリューションを提供します。

于 2016-07-26T22:16:40.353 に答える