繁体   English   中英

共享会话群集-对象未序列化错误

[英]Clustering with shared session - object not serialized error

我有一个环境,其中2个负载均衡的集群式tomcat指向同一应用程序。

当它们在粘性会话而不是共享会话下运行时,它们可以正常工作。 现在,我正在为tomcat实现故障转移。 即,如果一个失败,则另一个由失败的会话处理。 我正在尝试在内存中进行会话复制。

启用此功能后,我会遇到一些异常情况,例如

org.apache.catalina.ha.session.DeltaManager requestCompleted SEVERE:无法序列化sessionid的增量请求[68930629D2318EFAC06F3D75FFA162D0.tomcat2] java.io.NotSerializableException:java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:上的org.json.JSONObject: 1156)的java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)的java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)的java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)的Java。 org.apache.catalina.ha.session.DeltaRequest $ AttributeInfo.writeExternal(DeltaRequest.java:374)上的java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)上的io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)在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(Del org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:1120)位于org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:550)位于taManager.java:640) org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:519)的.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:537)在org.apache.catalina.ha.tcp org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:363)上的.ReplicationValve.sendReplicationMessage(ReplicationValve.java:430)在org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java :210),位于org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190),位于org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190),位于org.apache.jk.common。 org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)处的HandlerRequest.invoke(HandlerRequest.java:291)org.apache.jk.common.ChannelSocket.processConnection(Channe) org.apache.jk.common.ChannelSocket $ SocketConnection.runIt(ChannelSocket.java:891)的lSocket.java:698)org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:690)的ChannelSocket $ java.891在java.lang.Thread.run(Thread.java:619)2009年9月11日下午7:21:06 org.apache.catalina.ha.session.DeltaManager requestCompleted严重:无法序列化对sessionid的增量请求[68930629D2318EFAC06F3D75FFA162D0.tomcat2 ] java.io.NotSerializableException:org.json.JSONObject

由于JSON未序列化,因此我在将其设置为会话之前将其放入ArrayList中。 它在非共享会话环境中也可以正常工作。

我需要做些什么来启用故障转移? (请完成一些类似的操作,例如不要将对象保存在会话中。它不仅是导致错误的一个对象。对于其他对象(如数据源等),我也会出错。)

提前致谢

乌梅什

编辑:已经实现了序列化和瞬态

公共类ABC实现了Serializable {private static final long serialVersionUID = 2007L; 公共静态瞬态DataSource源;

收到此错误java.io.NotSerializableException:org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper ...存储属性“ ABC”,其值为NOT_SERIALIZED

您需要将其放入对象内,并在其中存储引用的字段标记为瞬态。

如果可以控制对象并需要它们,则实现可序列化的和必需的readObject(),writeObject()方法。

任何失败的对象都需要扩展以实现可序列化,或者不直接存储在会话中,而是作为瞬态字段放置在另一个对象中。 您需要使应用程序足够健壮,以在发生故障转移后重建这些对象。

确保在写入会话内容时必须实现java.io.Serializable接口

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM