2016-07-22 30 views
0

Ich habe für Hazelcast-Sitzung Replikation konfiguriert:Benutzerdefinierte Sitzung Listener mit Hazelcast-Sitzung Replikation

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

In meiner Web-Anwendung Benutzer kann Bestellung machen, die in der Sitzung bleibt bestehen, bis es fertig ist. Falls der Auftrag nicht abgeschlossen wurde und die Sitzung zerstört wurde (Benutzer ausgeloggt oder Sitzung abgelaufen), möchte ich alle Daten sichern, die von diesem Auftrag verarbeitet wurden.

Ohne Hz Sitzung Replikation, ich erreichen dies mit benutzerdefinierten Httpsessionlistener Implementierung wie:

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

und es funktioniert gut, aber mit Hz bekomme ich 2 verschiedene Sitzungen, die nicht synchronisiert werden:

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

Drucke sesId=HZDCDC1C77E7934E03A9FE329AAB7053B0 [email protected]

während

@Override 
public void sessionDestroyed(HttpSessionEvent se) { 
    System.out.print("sesId=" + se.getSession().getId()); 
    System.out.println("order=" + se.getSession().getAttribute("order")); 

druckt sesId=8748D170885C44B425FEEAA94AAB8A86 order=null.

Es scheint, dass Hazelcast seine eigene Sitzung erstellt und zerstört und ich kann nicht auf diese Sitzung Ereignisse hören (oder nicht wissen).

Ist es möglich, beide Sitzungen synchron zu halten oder einen eigenen Listener für Hz-Sitzung zu implementieren?

Antwort

1

Zwei Schritte sollten Sie es

bekommen Wenn Sie eine Instanz Hazelcast zuerst erstellen, dann können Sie den Namen, dass als Parameter übergeben,

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

so ist, dann wird die Sitzungsreplikation, dass prä- verwenden vorhandene Hazelcastinstanz, anstatt eine neue zu erstellen.

Wenn Sie diese Instanz erstellen, können Sie einen Listener wie gewohnt an die Sitzungsspeicherzuordnung anhängen.

<map name="my-sessions"> 
    <entry-listeners> 
    <entry-listener local="true" include-value="true">your.entry.Listener</entry-listener> 
    </entry-listeners> 
</map> 
+0

Ty für Ihre Hilfe, es funktionierte wie gesagt. Allerdings habe ich nicht ganz verstanden, warum ich eine weitere Hz-Instanz erstellen soll. Es funktionierte perfekt mit der Standardinstanz, ohne 'init-param' für 'instanzname' zu spezifizieren. Ich habe "hookercast-default.xml" einfach 'entry-listener' hinzugefügt. Wird bald eine weitere Antwort mit einer konkreten Erklärung hinzufügen, wie es gemacht werden könnte. – tarashypka

0

Als Neil Stevenson erwähnt, sollte Hazelcast Instanz mit EntryListener für my-sessions Karte vorkonfiguriert werden. Mit Filter für Session-Replikation, wie in meinem Fall habe ich

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

zu hazelcast.xml (die in der right place befindet).

Implementierung von EntryRemovedListener<String, SessionState> für Hz-Sitzung zu hören Ereignis wie

sein löscht
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 
    } 

Eigentlich Hazelcast provides eine Lösung für jede Veranstaltung.