RabbitMQ实现分布式WebSocket通信

RabbitMQ实现分布式WebSocket通信

  • 1、实现思路
  • 2、效果截图
    • 2.1 单用户推送消息
    • 2.1 多用户推送消息
    • 2.1 多用户间发送消息
  • 3、代码实现
  • 4、IllegalStateException异常修复

RabbitMQ基本操作: https://blog.csdn.net/Michael_lcf/article/details/124677268
RabbitMQ的5大核心概念: https://blog.csdn.net/Michael_lcf/article/details/126435452
RabbitMQ实现分布式WebSocket通信: https://blog.csdn.net/Michael_lcf/article/details/126403772

RabbitMQ实现分布式WebSocket通信_第1张图片

1、实现思路

1、WebSocket接收用户或者接口传过来的数据时,统一发送到RabbitMQ。

2、每个服务器监听RabbitMQ数据并获取数据,通过判断数据中persons是否为空来判断是单发还是群发,若persons不为空有用户id,每个服务器对比自己session中是否有这个用户id,若没有则不操作,若有则推送给该用户消息。
链接:

3、使用websocket在线测试 (websocket-test.com)测试工具,可以发送JSON数据来指定发给那个用户,数据格式如下:

{
	"persons":["101","201"],
	"msg":"你好啊 XXX 啊哈"
}

2、效果截图

2.1 单用户推送消息

RabbitMQ实现分布式WebSocket通信_第2张图片 RabbitMQ实现分布式WebSocket通信_第3张图片

2.1 多用户推送消息

RabbitMQ实现分布式WebSocket通信_第4张图片 RabbitMQ实现分布式WebSocket通信_第5张图片

2.1 多用户间发送消息

RabbitMQ实现分布式WebSocket通信_第6张图片

3、代码实现

gitee链接: https://gitee.com/michael_linux/spring-security-study/tree/master/websocket

RabbitMQ实现分布式WebSocket通信_第7张图片

4、IllegalStateException异常修复

java.lang.IllegalStateException: 远程 endpoint 处于 [TEXT_FULL_WRITING] 状态,是被调用方法的无效状态

原因:翻译过来就是同一时刻有两个线程执行了同一个websockt发送信息时产生了冲突。作者在这是使用的线程,其实也包括其他方式执行websocket。

解决:解决方法很简单,就是在使用websocket发送消息的时候加上同步锁,即保证不会同时被执行。

使用这段代码还是会报错
synchronized (UpdateProjectWebSocketEndPoint.class){
    try {
        session.getAsyncRemote().sendText(progress.toJSONString());
    } catch (IOException e) {
        log.error("WgetUtil.wgetProgressRation == "+e.getMessage());
    }
}

=================================================================
下面这段代码是没有问题的
synchronized (UpdateProjectWebSocketEndPoint.class){
    try {
        session.getBasicRemote().sendText(progress.toJSONString());
    } catch (IOException e) {
        log.error("WgetUtil.wgetProgressRation == "+e.getMessage());
    }
}

你可能感兴趣的:(JAVA,分布式,rabbitmq,websocket,分布式WebSocket通信)