小编Aur*_*oir的帖子

WebSocket会话可以序列化还是专门持久化到数据库?

上下文/背景: 客户端通过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)

serialization spring websocket tomcat8

7
推荐指数
0
解决办法
1670
查看次数

标签 统计

serialization ×1

spring ×1

tomcat8 ×1

websocket ×1