O JMSObjectGridEventListener foi projetado para suportar invalidação de cache próximo do lado do cliente e um mecanismo de replicação ponto a ponto. Ele é uma implementação Java Message Service (JMS) da interface do ObjectGridEventListener.
O mecanismo de invalidação do cliente pode ser usado em um ambiente distribuído doeXtreme Scale para garantir que os dados de cache próximos do cliente sejam sincronizados com os servidores ou outros cliente. Sem essa função, o cache perto do cliente pode deixar os dados obsoletos. Entretanto, mesmo com essa invalidação de cliente baseada em JMS, é necessário levar em consideração a janela de sincronização para atualizar um cache perto do cliente devido ao atraso do tempo de execução ao publicar as atualizações.
O mecanismo de replicação ponto a ponto pode ser usado em ambientes local e distribuído do eXtreme Scale. Ele é um processo de replicação de núcleo para núcleo do ObjectGrid e permite o fluxo de atualizações de dados entre os ObjectGrids locais e distribuídos. Por exemplo, com esse mecanismo, é possível mover as atualizações de dados de uma grade distribuída para um ObjectGrid local ou de qualquer grade para outra grade em um domínio de sistema diferente.
O JMSObjectGridEventListener requer que o usuário configure informações de JMS e Java Naming and Directory Interface (JNDI) para obter os recursos do JMS necessários. Além disso, as propriedades relacionadas à replicação devem ser configuradas corretamente. Em um ambiente JEE, o JNDI deve estar disponível em ambos os contêineres da web e do Enterprise JavaBean (EJB). Nesse caso, a propriedade JNDI é opcional, a menos que você deseje obter os recursos JMS externos.
Esse listener de evento possui propriedades que podem ser configuradas com o XML ou com abordagens programáticas, que podem ser usadas apenas para invalidação do cliente, apenas replicação ponto a ponto, ou ambos. A maioria das propriedades é opcional para customizar o comportamento para obter a funcionalidade necessária.
Para obter mais informações, consulte a API do JMSObjectGridEventListener.
Para obter mais informações, consulte a API do JMSObjectGridEventListener.
O plug-in do JMSObjectGridEventListener permite que as instâncias equivalentes do ObjectGrid recebam atualizações quando os dados na grade forem alterados ou despejados. Também permite que os clientes sejam notificados quando as entradas forem atualizadas ou despejadas de uma grade do eXtreme Scale. Esse tópico descreve como estender o plug-in do JMSObjectGridEventListener para permitir que os aplicativos sejam notificados quando uma mensagem JMS for recebida. Isso é mais útil ao usar a configuração do CLIENT_SERVER_MODEL para invalidação do cliente.
Durante a execução na função de receptor, o método JMSObjectGridEventListener.onMessage substituído é automaticamente chamado pelo tempo de execução do eXtreme Scale quando a instância do JMSObjectGridEventListener recebe atualizações de mensagem JMS da grade. Essas mensagens agrupam uma coleta de Objetos LogSequence . Os objetos LogSequence são transmitidos para o método onMessage e o aplicativo usa o LogSequence para identificar quais entradas de cache foram inseridas, excluídas, atualizadas ou invalidadas.
Para usar o ponto de extensão onMessage, os aplicativos executam as seguintes etapas.
A classe JMSObjectGridEventListener estendida é uma classe-filha da classe JMSObjectGridEventListener e só pode substituir dois métodos: o initialize (opcional) e o onMessage. Se uma classe-filha da classe JMSObjectGridEventListener precisar utilizar quaisquer artefatos de ObjectGrid como ObjectGrid ou Session no método onMessage, ela pegará esses artefatos no método de inicialização e os armazenará em cache como variáveis de instância. Além disso, no método onMessage, artefatos de ObjectGrid armazenados em cache podem ser utilizados para processar uma coleta de LogSequences transmitida.
A seguir há uma amostra de uma classe JMSObjectGridEventListener estendida.
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;
/**
* Essa é a grade associada a esse listener.
*/
ObjectGrid grid;
/**
* Essa é a sessão associada a esse listener.
*/
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) {
// Note: if need to use any ObjectGrid artifact, this class need to get ObjectGrid
// from the passed Session instance and get ObjectMap from session instance
// for any transactional ObjectGrid map operation.
super.initialize(session); // must invoke super's initialize method.
this.session = session; // cache the session instance, in case need to
// use it to perform map operation.
this.grid = session.getObjectGrid(); // get ObjectGrid, in case need
// to get ObjectGrid information.
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 + "]";
}
}
A classe JMSObjectGridEventListener estendida deve ser configurada da mesma forma para o mecanismo de invalidação de cliente e de replicação ponto a ponto. A seguir há um exemplo de configuração 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>