使用共享会话进行群集 - 对象未序列化错误

时间:2009-09-11 11:31:59

标签: java

我有一个环境,其中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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果你可以控制对象并需要它们,那么实现serializable&必要的readObject(),writeObject()方法。

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

答案 2 :(得分:0)

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