当前位置: 首页 > news >正文

第3篇:Spring Boot + WebSocket + 消息队列STOMP协议发布订阅模式 实现多频道实时消息广播

基于发布,订阅,主题 模式,实现原理图


前提:环境已经搭建好,具体看第二篇

1 maven依赖,springboot 版本3.3.1

<!-- 核心包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- 必须添加:用于 STOMP Relay 底层的 TCP 通信 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-reactor-netty</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>

2 核心类 WebSocketConfig 代码,这里设置了2个模式 (内存 和 外部 Rabbitmq)
本地开发调试可以用内存模式

import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; /** * WebSocket 配置类,用于配置基于 STOMP 协议的 WebSocket 消息代理。 * 本配置支持前端通过 SockJS 连接到后端,并使用简单内存消息代理(Simple Broker)进行消息路由。 */ @Configuration @EnableWebSocketMessageBroker // 启用 WebSocket 消息代理功能,支持 STOMP 协议 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { /** * 配置消息代理(Message Broker),用于处理客户端订阅和消息转发。 * * @param registry 消息代理注册器 */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // 【方式一:使用内置的简单内存消息代理(Simple Broker)】 // 适用于开发或轻量级场景,不依赖外部消息中间件(如 RabbitMQ、ActiveMQ)。 // 客户端可订阅以 /topic 或 /queue 开头的目的地,服务端可通过 SimpMessagingTemplate 发送消息。 //registry.enableSimpleBroker("/topic", "/queue"); // 【方式二:使用外部 STOMP 消息代理(如 RabbitMQ、ActiveMQ)——已注释】 // 若需在生产环境中使用高可用、持久化、集群等能力,应启用 STOMP Relay 并连接到外部消息中间件。 // 下面是启用 STOMP 中继代理(Relay)的示例配置(当前被注释): registry.enableStompBrokerRelay("/topic", "/queue") .setRelayHost("localhost") // 外部消息代理(如 ActiveMQ/RabbitMQ)的主机地址 .setRelayPort(61613) // STOMP 协议端口(ActiveMQ 默认为 61613,RabbitMQ 需启用插件) .setClientLogin("admin") // 客户端连接消息代理时使用的用户名 .setClientPasscode("admin") // 客户端连接消息代理时使用的密码 .setSystemLogin("admin") // 系统(服务端)连接消息代理时使用的用户名 .setSystemPasscode("admin"); // 系统(服务端)连接消息代理时使用的密码 // 设置应用前缀:所有以 /app 开头的消息将被路由到 @MessageMapping 注解的方法 // 例如:前端发送消息到 /app/chat.sendMessage,会由带有 @MessageMapping("/chat.sendMessage") 的方法处理 registry.setApplicationDestinationPrefixes("/app"); } /** * 注册 STOMP 协议的 WebSocket 端点,供客户端连接。 * * @param registry STOMP 端点注册器 */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 添加一个名为 "/ws" 的 WebSocket 端点 // 前端可通过 new SockJS('http://host:port/ws') 进行连接 registry.addEndpoint("/ws") .setAllowedOriginPatterns("http://192.168.0.100:51823") // 允许跨域来源 .withSockJS(); // 启用 SockJS 作为 WebSocket 的降级兼容方案(支持不支持 WebSocket 的浏览器) } }

3 处理前端通过 STOMP 协议发送的聊天消息

import com.pig4cloud.ai.bi6.config.WebSocketConfig; import com.pig4cloud.ai.bi6.pojo.ChatMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; /** * WebSocket 聊天控制器,用于处理前端通过 STOMP 协议发送的聊天消息。 * 本控制器接收以 /app/chat.send 为目的地的消息(因 WebSocketConfig 中设置了 /app 前缀), * 并将消息广播到指定的频道(如 /topic/topic_1)。 */ @Controller public class WebSocketChatController { //Spring 提供的模板类,用于向 WebSocket 客户端发送消息 @Autowired private SimpMessagingTemplate messagingTemplate; /** * 接收前端发送的消息 * * SimpMessageHeaderAccessor 消息头访问器 * * @param message */ @MessageMapping("/chat.send") public void handleChatMessage(ChatMessage message, SimpMessageHeaderAccessor headerAccessor) { //如果 握手拦截器HandshakeInterceptor 有存入数据,这里可以取过来使用 //System.out.println(headerAccessor.getSessionAttributes().get("xxxx")); // 假设前端传入了 channel 字段 (如 "topic_1") String targetChannel = message.getChannel(); if (targetChannel == null || targetChannel.isEmpty()) { targetChannel = "topic_1"; // 默认频道 } // 动态构建 destination: /topic/topic_1 String destination = "/topic/" + targetChannel; // 发送给所有订阅了该频道的人 messagingTemplate.convertAndSend(destination, message); System.out.println("Message sent to " + destination + ": " + message.getContent()); } /** * 也可以监听特定用户的消息 (私聊逻辑预留) * @MessageMapping("/chat.private") * @SendToUser("/queue/private") * public ... */ }

4 向 WebSocket 客户端发送消息

import com.pig4cloud.ai.bi6.pojo.ChatMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class ChatApiController { //Spring 提供的模板类,用于向 WebSocket 客户端发送消息 @Autowired private SimpMessagingTemplate messagingTemplate; /** * 测试接口:调用此接口,后端会主动向所有前端推送消息 */ @GetMapping("/push/{zhuti}") public String pushMessage(@PathVariable("zhuti") String zhuti, @RequestParam(defaultValue = "我是后端主动推送的消息!") String content) { ChatMessage msg = new ChatMessage("Server", content); // 核心代码:convertAndSend(目的地, 消息对象) // 目的地必须和前端订阅的一致 (/topic/public) messagingTemplate.convertAndSend("/topic/"+zhuti, msg); return "消息已推送到指定topic!请查看前端页面。"; } }

5 其它文件 pojo,前台在 第3篇 附录

import lombok.Data; @Data public class ChatMessage { private String from; // 发送者 private String content; // 内容 private Long timestamp; // 时间戳 private String channel; // 频道,主题 public ChatMessage() {} public ChatMessage(String from, String content) { this.from = from; this.content = content; this.timestamp = System.currentTimeMillis(); } }
http://www.jsqmd.com/news/472692/

相关文章:

  • 毕业论文AI率超标怎么办?嘎嘎降AI帮你一键搞定
  • asp毕业设计—— 基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码)——软件信息发布系统
  • Texlive + TexStudio 安装教程(附安装包)
  • 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出
  • asp毕业设计—— 基于asp+access的实验室设备管理系统设计与实现(毕业论文+程序源码)——实验室设备管理系统
  • 004、体系结构之TiKV分布式事务
  • 第5篇:websocket http握手拦截器HandshakeInterceptor 介绍和使用
  • springboot基于JavaWeb的网络流量数据样本管理系统2s55x231
  • 告别低效!Windows 部署 OpenClaw,解锁你的私人 AI 数字员工
  • 005、体系结构之TiKV_Raft日志
  • websocket 随手记
  • asp毕业设计—— 基于asp+access的网络招聘管理系统设计与实现(毕业论文+程序源码)——网络招聘管理系统
  • 探索AI视觉新高度:MMDetection深度学习框架详解
  • asp毕业设计—— 基于asp+access的网上动态同学录系统设计与实现(毕业论文+程序源码)——同学录系统
  • 第6篇:websocket 频道消息拦截器ChannelInterceptor 介绍和使用
  • 006、体系结构之TiKV读取和Coprocessor
  • python + word
  • C#毕业设计——基于C#+asp.net+SVG的基于SVG的自动站雨量分析系统设计与实现(毕业论文+程序源码)——雨量分析系统
  • 第3篇 附录:Spring Boot + WebSocket + 消息队列STOMP协议 示例-- 只有 前台页面
  • 探索Mask R-CNN:深度学习中的图像分割神器
  • Hive中rlike,like区别与使用详解
  • MAPPO动作类型改进(二)——MAPPO+连续环境
  • 2026年南京名酒回收市场选择参考:茅台、老酒、虫草及礼品回收服务指南 - 海棠依旧大
  • 多模态跟踪怎么搞?清华西电TPAMI 2025新方法深度解析,从小白到大神,吃透这一篇就够了!
  • 【Mutilism用传输门搭建D触发器/与非门/或非门】2022-3-11
  • C#毕业设计——基于C#+asp.net+SQL Server的课程指导平台设计与实现(毕业论文+程序源码)——课程指导平台
  • 2026年3月南京名酒回收机构选择指南:茅台回收、老酒回收、洋酒回收、红酒回收、虫草回收机构 - 海棠依旧大
  • 笔试题-_-
  • Simpleperf 性能工具介绍app_profiler.py -i perf.data
  • C#毕业设计——基于C#+asp.net+SQL server的通用作业批改系统设计与实现(毕业论文+程序源码)——作业批改系统