SpringCloud(若依微服务版为例)集成WebSocket实现前后端的消息推送
场景
SpringBoot+Vue整合WebSocket实现前后端消息推送:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114392573
若依微服务版手把手教你本地搭建环境并运行前后端项目:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303
在上面介绍了在SpringBoot+Vue的基础上使用WebSocket的过程以及使用SpringCloud(若依微服务版)搭建项目的基础上,如果在SpringCloud中使用WebSocket的过程。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
首先在需用集成WebSocket的服务下面添加WebSocket的依赖
<!-- WebSocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
这里是放在定时任务服务下面
然后在项目包路径下新建config目录,在此目录下新建WebSocketConfig配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}
然后在包下新建websocket目录,在此目录下新建WebSocketClient客户端实体类用来存储连接的会话个uri
import javax.websocket.Session;public class WebSocketClient {// 与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;//连接的uriprivate String uri;public Session getSession() {return session;}public void setSession(Session session) {this.session = session;}public String getUri() {return uri;}public void setUri(String uri) {this.uri = uri;}
}
然后还在此目录下新建WebSocketService服务类
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;@ServerEndpoint(value = "/websocket/{userName}")
@Component
public class WebSocketService {private static final Logger log = LoggerFactory.getLogger(WebSocketService.class);//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。private static int onlineCount = 0;//concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。private static ConcurrentHashMap<String, WebSocketClient> webSocketMap = new ConcurrentHashMap<>();/**与某个客户端的连接会话,需要通过它来给客户端发送数据*/private Session session;/**接收userName*/private String userName="";/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("userName") String userName) {if(!webSocketMap.containsKey(userName)){addOnlineCount(); // 在线数 +1}this.session = session;this.userName= userName;WebSocketClient client = new WebSocketClient();client.setSession(session);client.setUri(session.getRequestURI().toString());webSocketMap.put(userName, client);log.info("----------------------------------------------------------------------------");log.info("用户连接:"+userName+",当前在线人数为:" + getOnlineCount());try {sendMessage("来自后台的反馈:连接成功");} catch (IOException e) {log.error("用户:"+userName+",网络异常!!!!!!");}}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {if(webSocketMap.containsKey(userName)){webSocketMap.remove(userName);if(webSocketMap.size()>0){//从set中删除subOnlineCount();}}log.info("----------------------------------------------------------------------------");log.info(userName+"用户退出,当前在线人数为:" + getOnlineCount());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {log.info("收到用户消息:"+userName+",报文:"+message);//可以群发消息//消息保存到数据库、redisif(StringUtils.isNotBlank(message)){}}/**** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("用户错误:"+this.userName+",原因:"+error.getMessage());error.printStackTrace();}/*** 连接服务器成功后主动推送*/public void sendMessage(String message) throws IOException {synchronized (session){this.session.getBasicRemote().sendText(message);}}/*** 向指定客户端发送消息* @param userName* @param message*/public static void sendMessage(String userName,String message){try {WebSocketClient webSocketClient = webSocketMap.get(userName);if(webSocketClient!=null){webSocketClient.getSession().getBasicRemote().sendText(message);}} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocketService.onlineCount++;}public static synchronized void subOnlineCount() {WebSocketService.onlineCount--;}public static void setOnlineCount(int onlineCount) {WebSocketService.onlineCount = onlineCount;}public static ConcurrentHashMap<String, WebSocketClient> getWebSocketMap() {return webSocketMap;}public static void setWebSocketMap(ConcurrentHashMap<String, WebSocketClient> webSocketMap) {WebSocketService.webSocketMap = webSocketMap;}public Session getSession() {return session;}public void setSession(Session session) {this.session = session;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}
注意这里引入的WebSocketClient是上面新建的
找到网关的配置文件,这里是使用Nacos作为配置中心。将websocket的路径放开权限认证
这里是在ruoyi-gateway-dev.xml最后面的ignore-whites下面添加
- /schedule/websocket/**
这里是将websocket放在定时任务这个服务下面,这个服务的路由也在网关的配置文件中
然后为了简单化以及演示,这里直接在使用websocket的连接时直接不走网关,直接调用定时任务服务下的端口的服务
为了进行推送的测试,需要使用websocket客户端的测试工具,具体可自行解决,或者使用下面的工具
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/15630118
这里直接使用9203是具体定时任务服务的地址,而不是网关的端口,然后连接的地址为
ws://localhost:9203/websocket/badao
其中badao是传递的UserName参数,输入地址后点击连接,可以看到连接成功
并且点击发送数据
后台也会收到。
然后在后台新建一个测试的接口
@RestController
@RequestMapping("/schedule/websocket")
public class WebSocketTestController {@GetMapping("/push")public void push(SysJobLog sysJobLog){WebSocketService.sendMessage("badao","badao");}
}
调用此接口后,客户端也会收到发送的数据
这里是使用客户端工具来测试websocket,然后前端Vue集成websocket和上面的博客的集成流程一样。
SpringCloud(若依微服务版为例)集成WebSocket实现前后端的消息推送相关推荐
- SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...
- java连接imserver_java后端IM消息推送服务开发——协议
最近在一家saas企业使用Mqtt开发IM消息推送服务,把开发中的一些问题记录下来,项目仍在商用中,完整的消息服务包括4个模块---协议protocol,信令Signal,规则Rule,状态Statu ...
- android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)
1. Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...
- 史上最简单:SpringCloud 集成 mybatis-plus(以若依微服务版本为例)
编者按:若依微服务版是基于Spring Boot.Spring Cloud & Alibaba的微服务的权限管理系统,也是笔者比较推荐的个人学习和企业实践都比较优秀的开源项目. 笔者也以此项目 ...
- 若依微服务版怎样实现不同业务模块下实体和mapper互相调用
场景 若依微服务版怎样新增业务子模块并使用代码生成实现对表的增删改查: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109524 ...
- 若依微服务版怎样新增业务子模块并使用代码生成实现对表的增删改查
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在前 ...
- 若依微服务版手把手教你本地搭建环境并运行前后端项目
场景 若依微服务版RuoYi-Cloud,基于Spring Boot.Spring Cloud & Alibaba.OAuth2的前后端分离的后台管理系统. RuoYi-Cloud 是一个 J ...
- java框架之SpringCloud(2)-Rest微服务案例
在上一章节已经对微服务与 SpringCloud 做了介绍,为方便后面学习,下面以 Dept 部门模块为例做一个微服务通用 Demo -- Consumer 消费者(Client) 通过 REST 调 ...
- 若依微服务版的快速构建
若依微服务版的快速构建 目录 若依微服务版的快速构建 一.若依框架的介绍和所需要环境 系统需求 技术选型 内置功能 前期准备 二.下载若依微服务版本的代码 三.实现 初始化数据库 配置nacos 修改 ...
- 【学习日记2023.6.9】之 SpringCloud入门(认识微服务_服务拆分和远程调用RestTemplate_Eureka注册中心_Ribbon负载均衡_Nacos注册中心)
文章目录 SpringCloud 1. 认识微服务 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 1.5 总结 2. 服务拆分和远程调用 2.1 服务拆分原则 ...
最新文章
- amazeui学习笔记--css(HTML元素2)--代码Code
- free mybatis 不生效_关于 Mybatis 设置懒加载无效的问题
- 苹果的程序员三大定律
- 拳王虚拟项目公社:通过信息差获免费取虚拟资源,网上怎么售卖教程赚钱
- bootstrap table 服务端分页
- CSS 设置背景颜色透明,文字不透明
- python开始_python开始的一天
- 屏蔽登录QQ后总是弹出的QQ网吧页面
- 老婆生病了,后果很严重!
- C++11多线程std::thread的简单使用
- 初识Quartz之CronTrigger
- python 金融量化盘后分析系统V0.48
- 双向TVS的符号及几个参数问题?
- c语言问号的用法及举例,问号的使用方法和另类用法有哪些
- [源码阅读]解析Anime(JS动画库)核心(1)
- Windows / Linux dir 命令
- 用matlab求二重积分例题_matlab计算二重积分
- 亲戚关系关系算法java程序_C++并查集亲戚(Relations)算法实例
- php下lua的运行,phpStudy中起用lua脚本
- 蚂蚁金服区块链朱永春:蚂蚁金服业务新思路,用以往通用场景结合出新的解决方案...