Le programme JMSObjectGridEventListener est conçu pour prendre en charge l'invalidation du cache local côté client et un mécanisme de réplication entre homologues. Il s'agit d'une implémentation JMS (Java Message Service) de l'interface ObjectGridEventListener.
Le mécanisme d'invalidation de client peut être utilisé dans un environnement eXtreme Scale réparti pour garantir la synchronisation des données du cache local avec les serveurs ou les autres clients. Sans cette fonction, le cache local du client pourrait contenir des données obsolètes. Toutefois, même avec ce mécanisme d'invalidation de client JMS, vous devez prendre en compte le délai de mise à jour d'un cache local client en raison du retard de la publication des mises à jour.
Le mécanisme de réplication entre homologues peut être utilisé dans les environnements eXtreme Scale répartis et locaux. Il s'agit d'un processus de réplication de coeur à coeur qui permet aux mises à jour de données de circuler parmi les ObjectGrid locales et les ObjectGrid réparties. Par exemple, avec ce mécanisme, vous pouvez transférer des mises à jour de données d'une grille répartie vers une grille locale ou d'une grille vers une autre grille d'un autre domaine système.
Le programme JMSObjectGridEventListener exige de l'utilisateur la configuration des informations JMS et JNDI (Java Naming and Directory Interface) pour obtenir les ressources JMS requises. En outre, les propriétés de réplication doivent être définies correctement. Dans un environnement JEE, les informations JNDI doivent être disponibles dans les conteneurs Web et EJB (Enterprise JavaBean). Dans ce cas, la propriété JNDI est facultative à moins que vous ne souhaitiez obtenir des ressources JMS externes.
Ce programme d'écoute d'événement comporte des propriétés que vous pouvez configurer avec le langage XML ou à l'aide de programmes et pouvant être utilisées pour l'invalidation de client, pour la réplication entre homologues ou les deux. La plupart des propriétés sont facultatives afin de personnaliser le comportement permettant d'obtenir les fonctionnalités dont vous avez besoin.
Pour plus d'informations, consultez l'API JMSObjectGridEventListener.
Pour plus d'informations, consultez l'API JMSObjectGridEventListener.
Le plug-in JMSObjectGridEventListener permet aux instances ObjectGrid homologues de recevoir des mises à jour lorsque les données de la grille sont modifiées ou expulsées. Il permet également aux clients d'être avertis lors de la mise à jour ou de l'expulsion d'entrées d'une grille eXtreme Scale. Cette rubrique décrit l'extension du plug-in JMSObjectGridEventListener pour permettre aux applications d'obtenir une notification à réception d'un message JMS. Cette fonction est particulièrement utile lors de l'utilisation du paramètre CLIENT_SERVER_MODEL pour l'invalidation de client.
Lors d'une exécution avec le rôle récepteur, la méthode JMSObjectGridEventListener.onMessage substituée est automatiquement appelée par l'exécution eXtreme Scale lorsque l'instance JMSObjectGridEventListener reçoit des mises à jour du message JMS de la grille. Ces messages incluent une collection d'objets LogSequence. Les objets LogSequence sont transmis à la méthode onMessage et l'application utilise l'objet LogSequence pour identifier les entrées de cache qui ont été insérées, supprimées, mises à jour ou invalidées.
Pour utiliser le point d'extension onMessage, les applications suivent les étapes ci-dessous.
La classe étendue JMSObjectGridEventListener est un enfant de la classe JMSObjectGridEventListener et peut uniquement se substituer à deux méthodes : les méthodes initialize (facultative) et onMessage. Si une classe enfant de la classe JMSObjectGridEventListener doit utiliser des artefacts ObjectGrid tels que ObjectGrid ou Session dans la méthode onMessage, elle peut obtenir ces artefacts dans la méthode initialize et les mettre en cache en tant que variables d'instance. De même, dans la méthode onMessage, les artefacts ObjectGrid mis en cache doivent être utilisés pour traiter une collection de LogSequences transmise.
Voici un exemple de classe étendue JMSObjectGridEventListener.
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;
/**
* Grille associée à ce programme d'écoute d'événement.
*/
ObjectGrid grid;
/**
* Session associée à ce programme d'écoute d'événement.
*/
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) {
// Remarque : si l'utilisation d'un artefact ObjectGrid est requise, cette classe doit obtenir l'ObjectGrid
// de l'instance Session transmise et obtenir l'ObjectMap de l'instance Session
// pour toutes les opérations de mappe ObjectGrid transactionnelles.
super.initialize(session); // doit appeler la méthode initialize super.
this.session = session; // mettez en cache l'instance de session si son utilisation est
// requise pour effectuer une opération de mappe.
this.grid = session.getObjectGrid(); // obtenez ObjectGrid, si vous devez obtenir
// des informations d'ObjectGrid.
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 + "]";
}
}
La classe étendue JMSObjectGridEventListener doit être configurée de la même manière pour le mécanisme d'invalidation de client que pour le mécanisme de réplication entre homologues. L'exemple suivant illustre l'approche de la configuration XML.
<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>