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

时间:2015-03-06 00:32:08

标签: spring serialization websocket tomcat8

上下文/背景 客户端通过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会话。

0 个答案:

没有答案