0

J'ai deux nœuds de cache activés pour le stockage que j'essaie d'utiliser pour le préchargement du cache. Environ 1 million de comptes doivent être chargés par ces 2 nœuds activés pour le stockage. La clé et la valeur sont des objets String que j'essaie d'écrire dans le cache. J'utilise la méthode InvocationService.execute() pour appeler les tâches de pré-chargement de manière asynchrone:java.io.NotSerializableException lors de l'écriture dans le cache Oracle Coherence

for (Map.Entry<Member, LoaderInvocable> entry : mappedWork.entrySet()) { 
    Member member = entry.getKey(); 
    LoaderInvocable task = entry.getValue(); 
    invocationService.execute(task, Collections.singleton(member), null); 
} 

LoaderInvocable est une classe qui met en œuvre Invocable et Serializable interfaces et sa méthode run() a été écarté pour effectue le travail réel de la lecture de la base de données et de l'écriture à la cache.

InvocationService est défini comme suit dans le fichier de configuration de cohérence:

<invocation-scheme> 
     <scheme-name> 
     InvocationScheme</scheme-name> 
     <service-name> 
     LoaderInvocationService</service-name> 
     <autostart system-property="tangosol.coherence.invocation.autostart">true</autostart> 
</invocation-scheme> 

est Ci-dessous l'exception que je reçois:

2016-02-22 17:16:24,612 [pool-1-thread-1] ERROR (support.context.SessionExecutable) Caught exception from SessionExecutable.execute() 
(Wrapped) java.io.NotSerializableException: com.oracle.common.collections.ConcurrentLinkedQueue 
    at com.tangosol.util.Base.ensureRuntimeException(Base.java:289) 
    at com.tangosol.util.Base.ensureRuntimeException(Base.java:270) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.packetProcessor.PacketPublisher.packetizeMessage(PacketPublisher.CDB:28) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.packetProcessor.PacketPublisher$InQueue.add(PacketPublisher.CDB:8) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.packetProcessor.PacketPublisher.post(PacketPublisher.CDB:1) 
    at com.tangosol.coherence.component.net.Message.dispatch(Message.CDB:77) 
    at com.tangosol.coherence.component.net.Message.post(Message.CDB:1) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.service.Grid.post(Grid.CDB:2) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.service.Grid.send(Grid.CDB:1) 
    at com.tangosol.coherence.component.util.daemon.queueProcessor.service.grid.InvocationService.execute(InvocationService.CDB:33) 
    at com.tangosol.coherence.component.util.safeService.SafeInvocationService.execute(SafeInvocationService.CDB:1) 

. . . . . .

Caused by: java.io.NotSerializableException: com.oracle.common.collections.ConcurrentLinkedQueue 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at java.util.Hashtable.writeObject(Hashtable.java:988) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:438) 
    at com.tangosol.coherence.Component.writeObject(Component.CDB:1) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:438) 
    at com.tangosol.coherence.Component.writeObject(Component.CDB:1) 

Il semble que la moitié des comptes aient été mis en cache avec succès. Peut-il s'agir d'un problème spécifique à un nœud? Les deux nœuds de cache activés pour le stockage sont sur le même serveur utilisant la même configuration de cluster. À partir des journaux, il est clair que les deux nœuds ont rejoint le cluster avec succès.

+0

Même sur le même serveur, l'invocable va voyager sur le réseau de 1 noeud à l'autre et doit donc être sérialisable. –

+0

Ma classe LoaderInvocable est déjà Serializable, Paul. Toujours avoir l'erreur. Même les objets que je stocke dans le cache, est seulement String qui est implicitement sérialisable. –

+1

S'il vous plaît vérifier votre classe LoaderInvocable implémente PofSerializer –

Répondre

0

Merci Praveen. J'ai implémenté l'interface PortableObject et je n'ai plus fait face au NotSerializableException. Mais maintenant je suis confronté à un nouveau problème. Le deuxième nœud n'invoque pas la tâche et quitte le cluster sans exception dans les journaux.

J'ai utilisé le InvocationObserver qui suggère que memberLeft() le cluster. Peut-il être quelque chose de mal avec ma mise en œuvre des méthodes et writeExternal() pour la sérialisation? Ci-dessous l'implémentation:

@Override 
public void readExternal(PofReader paramPofReader) throws IOException { 
    // TODO Auto-generated method stub 

    cacheName = paramPofReader.readString(0); 
    firstRow = paramPofReader.readLong(1); 
    lastRow = paramPofReader.readLong(2); 

} 

@Override 
public void writeExternal(PofWriter paramPofWriter) throws IOException { 
    // TODO Auto-generated method stub 
    paramPofWriter.writeString(0, cacheName); 
    paramPofWriter.writeLong(1, firstRow); 
    paramPofWriter.writeLong(2, lastRow); 
}