2009-09-11 10 views
0

J'ai un environnement dans lequel 2 tomcats en cluster à charge équilibrée pointent vers la même application. Quand ils s'exécutent sous une session collante et non partagée, ils fonctionnent correctement. Maintenant, j'applique le basculement pour Tomcat. Par exemple, si l'un échoue, l'autre gère les sessions gérées par celui qui a échoué. Et j'essaye la réplication de session en mémoire.Clustering avec session partagée - objet non erreur sérialisée

Quand j'activer cette fonction, je reçois quelques exceptions comme

org.apache.catalina.ha.session.DeltaManager requestCompleted GRAVES: demande delta Impossible de serialize pour sessionid [68930629D2318EFAC06F3D75FFA162D0.tomcat2 ] java.io.NotSerializableException: org.json.JSONObject à java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1156) à java.io.ObjectOutputStream.defaultWriteFields (ObjectOutputStream.java:1509) à java. je o.ObjectOutputStream.writeSerialData (ObjectOutputStream.java:1474) à java.io.ObjectOutputStream.writeOrdinaryObject (ObjectOutputStream.java:1392) à java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1150) à java.io. ObjectOutputStream.writeObject (ObjectOutputStream.java:326) à org.apache.catalina.ha.session.DeltaRequest $ AttributeInfo.writeExternal (DeltaRequest.java:374) à org.apache.catalina.ha.session.DeltaRequest.writeExternal (DeltaRequest.java:272) à org.apache.catalina.ha.session.DeltaRequest.serialize (DeltaRequest.java:287) à org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest (DeltaManager.java:640) à org.apache.catalina.ha.session.DeltaManager.requestCompleted (DeltaManager.java:1 120) à org.apache.catalina.ha.tcp.ReplicationValve.send (ReplicationValve.java:550) à org.apache.catalina.ha.tcp.ReplicationValve.sendMessage (ReplicationValve.java:537) à org. apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage (ReplicationValve.java:519) à org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage (ReplicationValve.java:430) à org.apache.catalina.ha. tcp.ReplicationValve.invoke (ReplicationValve.java:363) à org.apache.catalina.ha.session.JvmRouteBinderValve.invoke (JvmRouteBinderValve.java:210) à org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter. java: 293) sur org.apache.jk.server.JkCoyoteHandler.invoke (JkCoyoteHandler.java:190) à org.apache.jk.common.HandlerRequest.invoke (HandlerRequest.java:291) à org.apache.jk.common.ChannelSocket.invoke (ChannelSocket.java:769) à org.apache.jk.common.ChannelSocket .processConnection (ChannelSocket.java:698) à org.apache.jk.common.ChannelSocket $ SocketConnection.runIt (ChannelSocket.java:891) à org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool .java: 690) at java.lang.Thread.run (Thread.java:619) 11 septembre 2009 7:21:06 PM org.apache.catalina.ha.session.DeltaManager requestCompleted GRAVE: Impossible de demande de sérialisation delta pour sessionid [68930629D2318EFAC06F3D75FFA162D0.tomcat2] java.io.NotSerializab leException: org.json.JSONObject

Depuis JSON est pas sérialisés Je mets à l'intérieur d'un ArrayList avant de le mettre en session. Et cela fonctionne très bien dans un environnement de session non partagé.

Que dois-je faire pour activer le basculement? (S'il vous plaît done dire quelque chose comme ne pas enregistrer l'objet en session. Son non seulement un objet qui provoque l'erreur. Je reçois des erreurs pour d'autres objets comme la source de données, etc .. ainsi)

Merci à l'avance

Umesh

Modifier: Vous avez déjà mis en œuvre sérialisation et transitoires

public class ABC implémente Serializable {private static final longue serialVersionUID = 2007L; source de source de données transitoire statique publique;

obtenir cette erreur java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper ... stockage attribut 'ABC' avec une valeur NOT_SERIALIZED

Répondre

0

Vous devez le mettre à l'intérieur un objet avec le champ stockant la référence marquée comme transitoire.

+0

Puis-je utiliser ArrayList? – Umesh

+0

Non. Bien que ArrayList marque son tableau interne Object [] en tant que transitoire, il appelle ObjectOutputStream.writeObject (array [i]) pour chaque élément du tableau. Pourquoi ne pas créer une classe titulaire simple (struct) pour JSONObject? –

0

Si vous pouvez contrôler les objets ET en avoir besoin, implémentez alors les méthodes readObject(), writeObject() sérialisables.

Tous les objets qui échouent doivent être étendus à l'outil sérialisable ou non stockés dans la session directement, mais placés dans un autre objet comme champ transitoire. Vous devez rendre votre application suffisamment robuste pour reconstruire ces objets après le basculement.

0

Assurez-vous que lors de l'écriture à quoi que ce soit session, il doit mettre en œuvre l'interface java.io.Serializable

Questions connexes