簡體   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