2016-07-22 71 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> 

在我的web应用程序的用户可以订购,直到它完成其坚持会话。如果订单没有完成,会话被销毁(用户注销或会话过期),我想备份该订单处理的所有数据。

没有赫兹会话复制,我完成这个自定义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]

while

@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 for your help,it worked as you said。但是,我并没有完全明白为什么我应该创建另一个Hz实例。它使用默认实例很好地工作,没有为'instance-name'指定'init-param'。我只是将'entry-listener'添加到'hazelcast-default.xml'中。将很快添加另一个答案,具体解释如何完成。 – tarashypka

0

尼尔·史蒂文森提到,Hazelcast实例应该与EntryListener预先配置为my-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任何事件的解决方案。