解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息
来源:互联网 发布:asp.net博客源码 编辑:程序博客网 时间:2024/06/13 04:42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
上述代码感觉上好像没问题。Session信息是保存在线程安全的集合,又通过volatile变量来修饰保证了内存可见性,但实际运行时却发现并没有想象的那么好。当客户端断开链接,时服务器需要发送消息给客户端时.服务端抛出异常:
- 1
- 1
不难看出,是服务端在关闭Session即将Session从线程安全的队列移除时,在发送消息的方法里应该被移除的Session消息却进入了发送消息的环节,在执行getBasicRemote().sendText(clientInfoJson);操作时发生了异常。
解决方法:
Google了大量资料后发现如果要解决这种线程安全的问题,不能通过线程安全的集合来保存Session解决。而应该保存整个类,并通过CopyOnWriteArraySet容器来操作。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
完美解决
备注:虽然我上面贴出来的代码是在COW中保存了整个类,但我测试的时候发生,保存Session也是可以的。
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
- 完美解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息
- 解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息
- SqliteOpenHelper the connection pool has been closed
- 过滤器解决Hibernate中(no session or session was closed)异常
- LazyInitializationException no session or session was closed异常的解决思路
- 解决javax.websocket.DeploymentException: The path [webSocket] is not valid.
- WebSocket服务器
- Sturts2异常:Cannot create a session after the response has been committed
- The surface has been released 异常
- redis异常解决:attempted to load session[xxx] which has been created but not yet serialized.
- websocket客户端与TCP服务器连接异常
- 【解决Tomcat启动异常】To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
- 【异常解决】To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
- Hibernate no session or session was closed 解决
- 解决no session or session was closed的问题
- WebSocket
- WebSocket
- WebSocket
- JavaScript -- 函数柯里化
- Python 环境下下载并安装NLTK说明
- java多线程之进程和线程
- 【android x86 5.1】system/core/目录下README翻译
- Android中部分修改字体和全局修改字体的方法
- 解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息
- BZOJ3620 似乎在梦中见过的样子
- ARKit & OpenGL ES
- 可以输入也可以下拉选择的select
- 完美数-java
- uboot
- 基于Cisco Packet Tracer6.0网络协议分析实验第二节
- [Linux]Ubuntu终端彻底删除软件
- Andriod 软件与硬件调试 无线调试