websocket多线程问题

在使用SpringMVC和Tomcat8开发WebSocket应用时,遇到后端多线程处理导致前端报错的问题。经过排查,发现Tomcat的WebSocket不支持并发消息发送。根据开发者反馈,解决方案包括同步发送消息或使用Tyrus 1.5。但同步操作引入了新的问题——消息顺序混乱,因此实现了公平锁等待队列来确保业务需求。
摘要由CSDN通过智能技术生成

开发框架

  • springMVC
  • tomcat8

问题描述

后端建立websocket 前端连接上来,后台会主动推送agent脚本执行信息,由于采用netty框架,保证并发性,执行的结果是多线程处理的,通过websocket返回前端居然报错了,很是费解。症状见下图。
981342-20180428151045254-561437414.jpg

981342-20180428151052216-1838738052.jpg

排查解决过程

从图中可以看出,远端处于【TEXT_PARTIAL_WRITING】状态,就这这个关键字google(不得不说就英文搜索而言,google强太多),
最后发现,tomcat的websocket没有相关的多线程处理,有人在apache上提bug,可以看一下开发者给的回复:
tomcat8 websocker bug

I
WebSocket是一种用于创建双向通信的协议,允许在客户端和服务器之间进行实时数据传输。在实现WebSocket多线程时,需要考虑以下几点: 1.每个连接都应该运行在自己的线程中,这样可以避免一个连接的阻塞对其他连接的影响。 2.为了避免过多的线程创建和销毁,可以使用线程池来管理连接的线程。 3.在处理WebSocket消息时,应该使用非阻塞的IO操作,以充分利用线程资源。 4.为了避免并发访问导致的数据竞争问题,可以使用锁或其他同步机制来保护共享数据。 以下是一个使用Python的Tornado框架实现WebSocket多线程的示例代码: ```python import tornado.websocket from concurrent.futures import ThreadPoolExecutor thread_pool = ThreadPoolExecutor(4) class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket opened") self.thread_pool = thread_pool def on_message(self, message): self.thread_pool.submit(self.process_message, message) def process_message(self, message): # process message asynchronously pass def on_close(self): print("WebSocket closed") ``` 在上面的代码中,我们使用了Tornado框架提供的WebSocketHandler类来处理WebSocket连接。在连接建立时,我们创建了一个线程池,并将其存储在连接对象中。在接收到消息时,我们使用线程池来异步处理消息,以避免阻塞WebSocket连接。最后,在连接关闭时,我们清理线程池并关闭连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值