2016-07-22 7 views
0

Я Hazelcast настроен для репликации сеанса:пользовательского сеанс Слушателей с 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> 

В моем вебе-приложениях пользователя может сделать заказ, который сохраняется в сессии, пока не будет закончен. Если заказ не был завершен, а сеанс был уничтожен (пользователь вышел из системы или закончился сеанс), я хочу сделать резервную копию всех данных, которые были обработаны этим заказом.

Без репликации сессии Гц, я сделать это с обычаем HttpSessionListener реализация как:

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

и она отлично работает, но с Гц я получаю 2 различных сессий, которые не синхронизируются:

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

отпечатки sesId=HZDCDC1C77E7934E03A9FE329AAB7053B0 [email protected]

@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?

ответ

1

Два шага вы должны получить там

При создании экземпляра 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> 
+0

Ty для вашей помощи, он работал, как вы сказали. Тем не менее, я не совсем понял, почему я должен создать другой экземпляр Hz. Он отлично справился с экземпляром по умолчанию без указания 'init-param' для' instance-name'. Я просто добавил 'entry-listener' в' hazelcast-default.xml'. Скоро добавит еще один ответ с конкретным объяснением того, как это можно сделать. – tarashypka

0

Как уже упоминалось Нил Стивенсон, экземпляр Hazelcast должен быть предварительно сконфигурирован с EntryListenermy-sessions для отображения. С фильтром для репликации сеанса, как в моем случае, я добавил

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

в hazelcast.xml (который расположен в right place).

Реализация EntryRemovedListener<String, SessionState> для прослушивания сессии Гц Удалить событие будет как

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 provides раствор для любого события.