Em um ambiente do WebSphere eXtreme Scale distribuído, o lado do cliente possui um cache local por padrão ao utilizar a estratégia de bloqueio otimista ou quando o bloqueio está desativado. O cache perto tem seus próprios dados locais armazenados em cache. Se um eXtreme Scale cliente confirmar uma atualização, a atualização chegará próxima do cache e do servidor. Entretanto, outros eXtreme Scale clientes não recebem as informações de atualização e poderão ter dados desatualizados.
Os aplicativos devem ficar cientes desse problema de dados obsoletos no cliente do eXtreme Scale. É possível usar a classe com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener ObjectGridEventListener baseada no Java Message Service (JMS) integrada para ativar o mecanismo de invalidação do cliente dentro de um ambiente distribuído do eXtreme Scale.
O mecanismo de invalidação do cliente é a solução para o problema de dados antigos no cache local do cliente no ambiente do eXtreme Scale distribuído. Esse mecanismo garante que o cache local ao cliente esteja em sincronia com os servidores ou outros clientes. Contudo, mesmo com esse mecanismo de invalidação do cliente baseado em JMS, o cache local do cliente não é atualizado imediatamente. Ocorre um atraso quando o tempo de execução publica as atualizações.
Para obter mais informações, leia sobre Listener de Eventos da JMS.
Exemplo de XML de modelo cliente/servidor
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="AgentObjectGrid">
<bean id="ObjectGridEventListener"
className="com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener">
<property name="invalidationModel" type="java.lang.String"
value="CLIENT_SERVER_MODEL" description="" />
<property name="invalidationStrategy" type="java.lang.String"
value="PUSH" description="" />
<property name="mapsToPublish" type="java.lang.String"
value="agent;profile;pessimisticMap" description="" />
<property name="jms_topicConnectionFactoryJndiName" type="java.lang.String"
value="defaultTCF" description="" />
<property name="jms_topicJndiName" type="java.lang.String"
value="defaultTopic" description="" />
<property name="jms_topicName" type="java.lang.String"
value="defaultTopic" description="" />
<property name="jms_userid" type="java.lang.String"
value="" description="" />
<property name="jms_password" type="java.lang.String"
value="" description="" />
<property name="jndi_properties" type="java.lang.String"
value="java.naming.factory.initial=org.apache.activemq.jndi.
ActiveMQInitialContextFactory;
java.naming.provider.url=
tcp://localhost:61616;connectionFactoryNames=defaultTCF;
topic.defaultTopic=defaultTopic"
description="jndi properties" />
</bean>
<backingMap name="agent" readOnly="false" pluginCollectionRef="agent" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="28800" />
<backingMap name="profile" readOnly="false" pluginCollectionRef="profile" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="pessimisticMap" readOnly="false" pluginCollectionRef="pessimisticMap" preloadMode="false"
lockStrategy="PESSIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="excludedMap1" readOnly="false" pluginCollectionRef="excludedMap1" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="excludedMap2" readOnly="false" pluginCollectionRef="excludedMap2" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
</objectGrid>
</objectGrids>
<backingMapPluginCollections>
<backingMapPluginCollection id="agent">
<bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.AgentObjectTransformer" />
</backingMapPluginCollection>
<backingMapPluginCollection id="profile">
<bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.ProfileObjectTransformer" />
<bean id="Evictor" className="com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor">
<property name="maxSize" type="int" value="2000" description="set max size for LRU evictor" />
<property name="sleepTime" type="int" value="15" description="evictor thread sleep time" />
<property name="numberOfLRUQueues" type="int" value="50" description="set number of LRU queues" />
</bean>
</backingMapPluginCollection>
<backingMapPluginCollection id="pessimisticMap" />
<backingMapPluginCollection id="excludedMap1" />
<backingMapPluginCollection id="excludedMap2" />
</backingMapPluginCollections>
</objectGridConfig>
Exemplo de XML de modelo de função dupla
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="AgentObjectGrid">
<bean id="ObjectGridEventListener"
className="com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener">
<property name="invalidationModel" type="java.lang.String" value="CLIENT_AS_DUAL_ROLES_MODEL" description="" />
<property name="invalidationStrategy" type="java.lang.String" value="PUSH" description="" />
<property name="mapsToPublish" type="java.lang.String" value="agent;profile;pessimisticMap" description="" />
<property name="jms_topicConnectionFactoryJndiName" type="java.lang.String" value="defaultTCF" description="" />
<property name="jms_topicJndiName" type="java.lang.String" value="defaultTopic" description="" />
<property name="jms_topicName" type="java.lang.String" value="defaultTopic" description="" />
<property name="jms_userid" type="java.lang.String" value="" description="" />
<property name="jms_password" type="java.lang.String" value="" description="" />
<property name="jndi_properties" type="java.lang.String"
value="java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory;java.naming.provider.url=
tcp://localhost:61616;connectionFactoryNames=defaultTCF;topic.defaultTopic=defaultTopic"
description="jndi properties" />
</bean>
<backingMap name="agent" readOnly="false" pluginCollectionRef="agent" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="28800" />
<backingMap name="profile" readOnly="false" pluginCollectionRef="profile" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="pessimisticMap" readOnly="false" pluginCollectionRef="pessimisticMap" preloadMode="false"
lockStrategy="PESSIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="excludedMap1" readOnly="false" pluginCollectionRef="excludedMap1" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
<backingMap name="excludedMap2" readOnly="false" pluginCollectionRef="excludedMap2" preloadMode="false"
lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
timeToLive="2700" />
</objectGrid>
</objectGrids>
<backingMapPluginCollections>
<backingMapPluginCollection id="agent">
<bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.AgentObjectTransformer" />
</backingMapPluginCollection>
<backingMapPluginCollection id="profile">
<bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.ProfileObjectTransformer" />
<bean id="Evictor" className="com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor">
<property name="maxSize" type="int" value="2000" description="set max size for LRU evictor" />
<property name="sleepTime" type="int" value="15" description="evictor thread sleep time" />
<property name="numberOfLRUQueues" type="int" value="50" description="set number of LRU queues" />
</bean>
</backingMapPluginCollection>
<backingMapPluginCollection id="pessimisticMap" />
<backingMapPluginCollection id="excludedMap1" />
<backingMapPluginCollection id="excludedMap2" />
</backingMapPluginCollections>
</objectGridConfig>