上下文/背景 客户端通过Web套接字连接。服务器在Map中存储WebSocket会话和一些其他标识符以供以后使用。服务器从队列中接收一些需要通过web-socket发送给客户端的数据。使用Map中的会话我可以将其发送到客户端。到目前为止一切都很好
这一切都适用于单个节点,但没有多个节点(不需要群集),原因是WebSocket会话不是Serializable因此deiemma :(。我希望将WebSocket会话存储在Postgresql数据库中供以后使用但我对序列化感到震惊。
我尝试了什么: 有人在non serializable session websocket java ee问了类似的问题。 我尝试在Tomcat的Session周围创建一个包装器并提供readObject writeObject,但不幸的是WsSession不允许设置/读取状态。
尝试使用库https://github.com/EsotericSoftware/kryo,但在序列化WsSession的包装器方面没有成功。
我的环境: JDK 1.8.0_31, Tomcat 8.0.20, Spring 4.1.5.RELEASE, Debian Wheezy。
感谢您的帮助。
更新 在尝试使用Kryo进行序列化时,我得到了以下异常
com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
Serialization trace:
classes (sun.misc.Launcher$AppClassLoader)
applicationClassLoader (org.apache.tomcat.websocket.WsSession)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:101) ~[kryo-3.0.1-SNAPSHOT.jar:?]
我也尝试了XStream http://x-stream.github.io/并且它确实序列化为xml,但是当反序列化时我得到以下异常
---- Debugging information ----
message : Could not call java.security.CodeSource.readObject()
cause-exception : java.lang.RuntimeException
cause-message : null
class : java.security.CodeSource
required-type : java.security.CodeSource
converter-type : com.thoughtworks.xstream.converters.reflection.SerializableConverter
path : /org.apache.tomcat.websocket.WsSession/applicationClassLoader/parent/defaultDomain/codesource/java.security.CodeSource
line number : 30863
class[1] : java.security.ProtectionDomain
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2] : sun.misc.Launcher$ExtClassLoader
class[3] : sun.misc.Launcher$AppClassLoader
class[4] : org.apache.tomcat.websocket.WsSession
version : 1.4.8
更新1: 更改设计,以便不需要序列化websocket会话。