上下文/背景: 客户端通过Web套接字连接.服务器在Map中存储WebSocket会话和一些其他标识符以供以后使用.服务器从队列中接收一些需要通过web-socket发送给客户端的数据.使用Map中的会话我可以将其发送到客户端.到目前为止一切都很好
这一切都适用于单个节点,但没有多个节点(不需要群集),原因是WebSocket会话不是Serializable因此deiemma :(.我希望将WebSocket会话存储在Postgresql数据库中供以后使用但是我很震惊在序列化.
我尝试了什么: 其他人在非序列化会话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:?]
Run Code Online (Sandbox Code Playgroud)
我也尝试了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] : …Run Code Online (Sandbox Code Playgroud)