JMS-Ereignis-Listener

Der JMSObjectGridEventListener unterstützt einen Mechanismus für die Inaktivierung des clientseitigen nahen Caches und einen Mechanismus für die Peer-to-Peer-Replikation. Er ist eine JMS-Implementierung (Java Message Service) der Schnittstelle "ObjectGridEventListener".

Der Mechanismus für die Clientinaktivierung kann in einer verteilten eXtreme-Scale-Umgebung verwendet werden, um sicherzustellen, dass die Daten im clientnahen Cache mit Servern oder anderen Clients synchronisiert werden. Ohne diese Funktion könnte der clientnahe Cache veraltete Daten enthalten. Aber selbst mit diesem JMS-basierten Mechanismus für Clientinaktivierung müssen Sie wegen der Verzögerung für die Laufzeitumgebung beim Veröffentlichen von Aktualisierungen das Zeitfenster für die Aktualisierung eines clientnahen Caches berücksichtigen.

Der Mechanismus für die Peer-to-Peer-Replikation kann in verteilten und lokalen eXtreme-Scale-Umgebungen verwendet werden. Er ist ein Kern-zu-Kern-Replikationsprozess und lässt die Übertragung von Datenaktualisierungen zwischen lokalen ObjectGrids und verteilten ObjectGrids zu. Mit diesem Mechanismus können Sie beispielsweise Datenaktualisierungen aus einem verteilten Grid in ein lokales ObjectGrid oder aus einem anderen Grid in einer anderen Systemdomäne verschieben.

Der JMSObjectGridEventListener erfordert, dass der Benutzer JMS- und JNDI-Informationen (Java Naming and Directory Interface) konfiguriert, damit die erforderlichen JMS-Ressourcen abgerufen werden. Außerdem müssen replikationsbezogene Eigenschaften ordnungsgemäß gesetzt werden. In einer JEE-Umgebung muss JNDI in Web- und EJB-Containern (Enterprise JavaBean) verfügbar sein. In diesem Fall ist die JNDI-Eigenschaft optional, sofern Sie keine externen JMS-Ressourcen abrufen möchten.

Dieser Ereignis-Listener hat Eigenschaften, die Sie über XML- oder programmgesteuerte Ansätze konfigurieren und nur für die Clientinaktivierung und/oder nur für die Peer-to-Peer-Replikation verwenden können. Die meisten Eigenschaften sind für die Anpassung des Verhaltens zum Erzielen der erforderlichen Funktionalität optional.

Weitere Informationen finden Sie im Abschnitt API "JMSObjectGridEventListener".

Weitere Informationen finden Sie in den Informationen zur API "JMSObjectGridEventListener".

JMSObjectGridEventListener-Plug-in erweitern

Das JMSObjectGridEventListener-Plug-in ermöglicht Peer-ObjectGrid-Instanzen, Aktualisierungen zu empfangen, wenn die Daten im Grid geändert oder entfernt wurden. Außerdem ermöglicht es die Benachrichtigung von Clients, wenn Einträge aktualisiert oder einem eXtreme-Scale-Grid entfernt werden. In diesem Abschnitt wird beschrieben, wie das JMSObjectGridEventListener-Plug-in erweitert werden kann, damit Anwendungen beim Empfang einer JMS-Nachricht benachrichtigt werden können. Dies ist äußerst hilfreich, wenn die Einstellung CLIENT_SERVER_MODEL für die Clientinaktivierung verwendet wird.

Bei der Ausführung in der Empfängerrolle wird die überschriebene Methode "JMSObjectGridEventListener.onMessage" automatisch von der eXtreme-Scale-Laufzeitumgebung aufgerufen, wenn die JMSObjectGridEventListener-Instanz JMS-Nachrichtenaktualisierungen vom Grid empfängt. Diese Nachrichten schließen eine Sammlung von LogSequence-Objekten ein. Die LogSequence-Objekte werden an die Methode "onMessage" übergeben, und die Anwendung verwendet das LogSequence-Objekt, um die Cacheeinträge zu identifizieren, die eingefügt, gelöscht, aktualisiert oder ungültig gemacht wurden.

Zur Verwendung des onMessage-Erweiterungspunkts führen Anwendungen die folgenden Schritte aus:

  1. Erstellen Sie eine neue Klasse, die die Klasse "JMSObjectGridEventListener" erweitert und die Methode "onMessage" überschreibt.
  2. Konfigurieren Sie den erweiterten JMSObjectGridEventListener auf dieselbe Weise wie den ObjectGridEventListener für ObjectGrid.

Die erweiterte Klasse "JMSObjectGridEventListener" ist eine Unterklasse der Klasse "JMSObjectGridEventListener" und kann nur zwei Methoden überschreiben: initialize (optional) und onMessage. Wenn eine Unterklasse der Klasse "JMSObjectGridEventListener" ObjectGrid-Artefakte wie ObjectGrid oder Session in der Methode "onMessage" verwenden muss, kann sie diese Artefakte in der Methode "initialize" abrufen und als Instanzvariablen zwischenspeichern. In der Methode "onMessage" können zwischengespeicherte ObjectGrid-Artefakte verwendet werden, um eine übergebene LogSequence-Sammlung zu verarbeiten.

Anmerkung: Die überschriebene Methode "initialize" muss die Methode "super.initialize" aufrufen, um den übergeordneten JMSObjectGridEventListener ordnungsgemäß zu initialisieren.

Im Folgenden sehen Sie ein Beispiel für eine erweiterte JMSObjectGridEventListener-Klasse:

package com.ibm.websphere.samples.objectgrid.jms.price;

import java.util.*;
import com.ibm.websphere.objectgrid.*;
import com.ibm.websphere.objectgrid.plugins.LogElement;
import com.ibm.websphere.objectgrid.plugins.LogSequence;
import com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener;

public class ExtendedJMSObjectGridEventListener extends JMSObjectGridEventListener{
	protected static boolean debug = true;
	
    /**
     * Dieses Grid ist dem Listener zugeordnet.
     */
    	ObjectGrid grid;

    /**
     * Die Sitzung, die dem Listener zugeordnet ist
     */
    	Session session;
    
    String objectGridType;
    
    public List receivedLogSequenceList = new ArrayList();

 
	/* (non-Javadoc)
	 * @see com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener
				#initialize(com.ibm.websphere.objectgrid.Session)
	 */
public void initialize(Session session) {
		// Anmerkung: Wenn Sie ein ObjectGrid-Artefakt verwenden müssen, muss diese Klasse
  // ObjectGrid von der übergebenen Session-Instanz und die ObjectMap von der
		// Session-instanz für jede transaktionsorientierte ObjectGrid-Map-Operation abrufen.
		
		super.initialize(session);  // Die Methode initialize der Superklasse muss aufgerufen werden
		this.session = session; // Session-Instanz zwischenspeichern, falls sie
		//			zum Durchführen der Map-Operation benötigt wird
		this.grid = session.getObjectGrid(); // ObjectGrid abrufen, falls
		//			ObjectGrid-Informationen abgerufen werden müssen
		
		if (grid.getObjectGridType() == ObjectGrid.CLIENT)
			objectGridType = "CLIENT";
		else if (grid.getObjectGridType() == ObjectGrid.SERVER)
			objectGridType = "Server";

		if (debug)
			System.out.println("ExtendedJMSObjectGridEventListener[" +
					objectGridType + "].initialize() : grid = "	+ this.grid);
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener
				#onMessage(java.util.Collection)
	 */
	protected void onMessage(Collection logSequences) {
		System.out.println("ExtendedJMSObjectGridEventListener[" +
				objectGridType + "].onMessage(): ");
		
		Iterator iter = logSequences.iterator();
		
		while (iter.hasNext()) {
            LogSequence seq = (LogSequence) iter.next();
            
    		StringBuffer buffer = new StringBuffer();
    		String mapName = seq.getMapName();
    		int size = seq.size();
    		buffer.append("\nLogSequence[mapName=" + mapName + ", size=" + size + ",
					objectGridType=" + objectGridType
    				+ "]: ");

    		Iterator logElementIter = seq.getAllChanges();
    		for (int i = seq.size() - 1; i >= 0; --i) {
    			LogElement le = (LogElement) logElementIter.next();
    			buffer.append(le.getType() + " -> key=" + le.getCacheEntry().getKey() + ", ");
    		}
    		buffer.append("\n");

    		receivedLogSequenceList.add(buffer.toString());

    if (debug) {
    			System.out.println("ExtendedJMSObjectGridEventListener["
						+ objectGridType + "].onMessage(): " + buffer.toString());
    		}
		}    
	}
	
	public String dumpReceivedLogSequenceList() {
		String result = "";
		int size = receivedLogSequenceList.size();
		result = result + "\nExtendedJMSObjectGridEventListener[" + objectGridType
				+ "]: receivedLogSequenceList size = " + size + "\n";
for (int i = 0; i < size; i++) {
			result = result + receivedLogSequenceList.get(i) + "\n";
		}
		return result;
	}

	public String toString() {
		return "ExtendedJMSObjectGridEventListener["
				+ objectGridType + " - " + this.grid + "]";
	}
}

Konfiguration

Die erweiterte JMSObjectGridEventListener-Klasse muss für den Mechanismus für die Clientinaktivierung und für den Mechanismus für die Peer-to-Peer-Replikation gleich konfiguriert werden. Im Folgenden sehen Sie ein Beispiel für die XML-Konfiguration:

<objectGrid name="PRICEGRID">
			<bean id="ObjectGridEventListener"
				className="com.ibm.websphere.samples.objectgrid.jms.
						price.ExtendedJMSObjectGridEventListener">
				<property name="invalidationModel" type="java.lang.String"
					value="CLIENT_SERVER_MODEL" description="" />
				<property name="invalidationStrategy" type="java.lang.String"
					value="INVALIDATE" description="" />
				<property name="jms_topicConnectionFactoryJndiName" type="java.lang.String"
					value="jms/TCF" description="" />
				<property name="jms_topicJndiName" type="java.lang.String"
					value="GRID.PRICEGRID" description="" />
				<property name="jms_topicName" type="java.lang.String"
					value="GRID.PRICEGRID" description="" />
				<property name="jms_userid" type="java.lang.String" value=""
					description="" />
				<property name="jms_password" type="java.lang.String" value=""
					description="" />					
			</bean>
			<backingMap name="PRICE" pluginCollectionRef="PRICE"></backingMap>
      	</objectGrid>
Anmerkung: Der Klassenname der Bean "ObjectGridEventListener" wird mit der erweiterten JMSObjectGridEventListener-Klasse mit denselben Eigenschaften wie die generische JMSObjectGridEventListener-Klasse konfiguriert.