Spring WebSocket消息无法送达/my-topic主题问题求助
问题排查与解决方案
核心问题定位
从代码和日志来看,厨师端已成功连接并订阅主题,但收不到消息,优先排查以下几个关键环节:
1. 前端消息解析逻辑错误
厨师端代码中,后端@SendTo直接返回的是List<ProductData>集合,但前端错误尝试读取data.productList字段:
var newProductList = data.productList; // 错误:后端返回的就是数组本身,不是包含productList字段的对象
修复方案:
直接使用解析后的data作为产品列表:
var data = JSON.parse(order.body); console.log("прилетело"+ order.body); productList = data; // 直接赋值返回的数组 displayProductList(productList);
2. 管理员端消息发送格式错误
管理员端发送消息时,stompAdminClient.send的第三个参数需要是JSON字符串,直接传入对象会导致后端无法正确解析,甚至消息发送失败:
// 原代码存在格式问题 stompAdminClient.send('/app/chef', {}, productList)
修复方案:
将对象序列化为JSON字符串后发送:
stompAdminClient.send('/app/chef', {}, JSON.stringify(productList))
3. 后端日志缺失与验证
在后端receiveOrder方法中添加日志,确认是否真的收到并转发了消息:
@MessageMapping("/chef") @SendTo("/my-topic") public List<ProductData> receiveOrder(List<ProductData> order) { log.info("收到管理员订单:{}", order); log.info("转发订单到/my-topic:{}", order); return order; }
同时开启Spring WebSocket的DEBUG日志,查看消息流转细节:
在application.yml中添加:
logging: level: org.springframework.messaging: DEBUG org.springframework.web.socket: DEBUG
检查日志中是否存在Sending message to destination '/my-topic'相关记录。
4. WebSocket Broker配置验证
确保后端已正确配置WebSocket消息代理,允许/my-topic作为订阅主题:
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { // 启用简单消息代理,允许订阅/my-topic前缀的主题 config.enableSimpleBroker("/my-topic"); // 配置应用前缀,对应前端发送的/app/chef config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 注册厨师端连接端点,对应前端new SockJS('/chef') registry.addEndpoint("/chef").withSockJS(); // 管理员端连接端点也需注册(如果有) registry.addEndpoint("/admin").withSockJS(); } }
如果缺少enableSimpleBroker("/my-topic")配置,消息将无法转发到订阅客户端。
5. Stomp版本兼容性检查
前端使用的stomp.js 2.3.3版本较旧,可能与后端Spring WebSocket的Stomp实现存在协议兼容性问题。建议升级前端stomp.js到稳定新版本(如6.1.2),同时确保后端Spring版本与前端Stomp版本匹配。
验证步骤
- 先修复前端解析逻辑和管理员端发送格式,重新测试。
- 查看后端日志,确认消息接收和转发流程正常。
- 检查WebSocket配置,确保代理主题和端点配置正确。
内容的提问来源于stack exchange,提问作者silhouettes
相关产品推荐
相关产品推荐

