当前位置:   article > 正文

webSocket中并发的策略_websocket缓存一直增加如何处理

websocket缓存一直增加如何处理

问题描述:当客户端发送请求建立连接以后,服务器会采用一种数据结构来维护这个连接,具体体现就是每次连接,服务器就会产生一个Session,这个Session可以唯一标识这个通道,发数据的时候会把指定的数据放到特定的通道里面去。那么并发情况下,如何实现呢?

从开始一个最简单的webSocket实例跑通了以后就慢慢考虑并发的问题,策略换了好几种,不过都是大家讨论后的结果,由于水平有限不一定是最优的方案。

服务器端通过继承父类的handleTextMessage方法来处理产生的session和从客户端传过来的参数。关于采用什么样的数据结构来存储session和message讨论出来了很多方案。

  1. protected void handleTextMessage(WebSocketSession session,
  2. TextMessage message) throws Exception {
  3. super.handleTextMessage(session, message);
  4. }
发送消息的时候需要把参数转化成TextMessage类型,然后调用通道的sendMessage方法,如下:

  1. public void sendMessage(String request) throws IOException {
  2. TextMessage returnMessage = new TextMessage(request);
  3. session.sendMessage(returnMessage);
  4. }
  5. }
那么并发情况下,由于是多个客户端连接,需要建立多个通道,通道可以在handleTextMessage的方法里面采用一种数据结构收集起来,然后在sendMessage方法中指定通道然后发送对应的消息。在前一篇文章中提到我们项目中已经做好了一套通信机制:终端发过来的数据通过NIOServer转发到activeMQ中,也就是说所有的消息可以通过activeMQ的出口得到,那么这里就是一种观察者模式的使用了,也就是多个webSocket通道就是多个观察者,而这个监听的出口就是被观察者,当消息队列出口出来一条消息的时候,就类似于被观察者的发生变化了然后通知多个webSocket通道,webSocket通道知道出来消息了马上就检查这条消息是不是自己要的,如果是的话就发送到当前通道中。在handleTextMessage方法中,会从客户端传回来一个参数message,这个message就是表示通道订阅的消息,也就是每次从队列里面出来一条消息,我就检查这条消息是否是我订阅的,即将消息解析后然后和message参数比对。不知道我有没有说清楚,应该是不难理解的。

那么采

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/892266
推荐阅读
相关标签
  

闽ICP备14008679号