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

1、WebSocket接收用户或者接口传过来的数据时,统一发送到RabbitMQ。
2、每个服务器监听RabbitMQ数据并获取数据,通过判断数据中persons是否为空来判断是单发还是群发,若persons不为空有用户id,每个服务器对比自己session中是否有这个用户id,若没有则不操作,若有则推送给该用户消息。
链接:
3、使用websocket在线测试 (websocket-test.com)测试工具,可以发送JSON数据来指定发给那个用户,数据格式如下:
{
"persons":["101","201"],
"msg":"你好啊 XXX 啊哈"
}
gitee链接: https://gitee.com/michael_linux/spring-security-study/tree/master/websocket
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());
}
}