You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本匹配。

验证步骤

  1. 先修复前端解析逻辑和管理员端发送格式,重新测试。
  2. 查看后端日志,确认消息接收和转发流程正常。
  3. 检查WebSocket配置,确保代理主题和端点配置正确。

内容的提问来源于stack exchange,提问作者silhouettes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:20:24