简体   繁体   English

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

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

I have an environment where 2 load-balanced clustered tomcats pointing to same application. 我有一个环境,其中2个负载均衡的集群式tomcat指向同一应用程序。

When they run under sticky session and not shared session, they works fine. 当它们在粘性会话而不是共享会话下运行时,它们可以正常工作。 Now I am implementing failover for tomcat. 现在,我正在为tomcat实现故障转移。 ie If one one fails other handles the sessions that handled by the failed one. 即,如果一个失败,则另一个由失败的会话处理。 And I am trying in-memory session replication. 我正在尝试在内存中进行会话复制。

When I enable this feature, I am getting some exceptions like 启用此功能后,我会遇到一些异常情况,例如

org.apache.catalina.ha.session.DeltaManager requestCompleted SEVERE: Unable to serialize delta request for sessionid [68930629D2318EFAC06F3D75FFA162D0.tomcat2] java.io.NotSerializableException: org.json.JSONObject at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:374) at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:272) at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:287) at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(Del 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 taManager.java:640) at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:1120) at org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:550) at org.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:537) at org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:519) at org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage(ReplicationValve.java:430) at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:363) at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:210) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) at org.apache.jk.common.ChannelSocket.processConnection(Channe 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) lSocket.java:698) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) at java.lang.Thread.run(Thread.java:619) Sep 11, 2009 7:21:06 PM org.apache.catalina.ha.session.DeltaManager requestCompleted SEVERE: Unable to serialize delta request for sessionid [68930629D2318EFAC06F3D75FFA162D0.tomcat2] java.io.NotSerializableException: org.json.JSONObject 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

Since JSON is not serialized I am putting it inside an ArrayList before setting it in session. 由于JSON未序列化,因此我在将其设置为会话之前将其放入ArrayList中。 And it works fine in non shared session environment. 它在非共享会话环境中也可以正常工作。

What I need to do for enabling fail over? 我需要做些什么来启用故障转移? (Please done tell something like don't save the object in session. Its not only the one object which causing error. I am getting errors for other objects like Data source etc.. as well) (请完成一些类似的操作,例如不要将对象保存在会话中。它不仅是导致错误的一个对象。对于其他对象(如数据源等),我也会出错。)

Thanks in advance 提前致谢

Umesh 乌梅什

Edit: Have already implemented serialization and transient 编辑:已经实现了序列化和瞬态

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

Getting this error java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper ... storing attribute 'ABC' with value NOT_SERIALIZED 收到此错误java.io.NotSerializableException:org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper ...存储属性“ ABC”,其值为NOT_SERIALIZED

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

If you can control the objects AND need them, then implement serializable & the necessary readObject(), writeObject() methods. 如果可以控制对象并需要它们,则实现可序列化的和必需的readObject(),writeObject()方法。

Any objects that fail either need to be extended to implement serializable, or not stored in the session directly, but placed in another object as a transient field. 任何失败的对象都需要扩展以实现可序列化,或者不直接存储在会话中,而是作为瞬态字段放置在另一个对象中。 You need to make your application robust enough to rebuild these objects after the failover happens. 您需要使应用程序足够健壮,以在发生故障转移后重建这些对象。

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

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

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