我有一个环境,其中2个负载均衡的群集tomcats指向同一个应用程序。
当他们在粘性会话下运行而不是共享会话时,它们工作正常。现在我正在为tomcat实现故障转移。即如果一个人失败,则其他人处理由失败者处理的会话。我正在尝试内存会话复制。
当我启用此功能时,我会遇到一些例外情况,例如
org.apache.catalina.ha.session.DeltaManager requestCompleted严重:无法 序列化对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) 在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:1120) 在org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:550) 在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) 在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) 在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) at org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:690) 在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未被序列化,因此在将其设置为session之前将其放在ArrayList中。它在非共享会话环境中工作正常。
启用故障转移需要做些什么? (请完成告诉我们不要在会话中保存对象。它不仅是导致错误的一个对象。我收到其他对象的错误,如数据源等..)
提前致谢
Umesh制作
编辑:已经实现了序列化和瞬态
公共类ABC实现Serializable { private static final long serialVersionUID = 2007L; 公共静态瞬态DataSource源;
获取此错误 java.io.NotSerializableException:org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper ... 存储属性'ABC',其值为NOT_SERIALIZED
答案 0 :(得分:0)
您需要将其放在一个对象中,该字段存储标记为瞬态的引用。
答案 1 :(得分:0)
如果你可以控制对象并需要它们,那么实现serializable&必要的readObject(),writeObject()方法。
任何失败的对象都需要扩展以实现可序列化,或者不直接存储在会话中,而是作为瞬态字段放在另一个对象中。您需要使应用程序足够健壮,以便在发生故障转移后重建这些对象。
答案 2 :(得分:0)
确保在向会话写入任何内容时,必须实现java.io.Serializable接口