簡體   English   中英

具有Hazelcast會話復制的自定義會話偵聽器

[英]Custom session Listener with Hazelcast session replication

我為會話復制配置了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會話實現您自己的偵聽器?

兩步就可以到達你

如果您首先創建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>

正如尼爾·史蒂文森(Neil Stevenson)所提到的,應該為my-sessions映射使用EntryListener預配置Hazelcast實例。 與我的情況一樣,使用用於會話復制的過濾器,我添加了

<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 為任何事件提供解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM