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

使用stompjs连接Spring Boot STOMP端点无响应问题求助

问题:StompJS 无法连接 Spring Boot STOMP 端点

我尝试使用stompjs库连接Spring Boot的STOMP端点,客户端代码存在冗余问题(重复创建Client实例),修正后的完整代码如下:

const client = new Client({
  brokerURL: "ws://192.168.179.77:8080/gs-guide-websocket",
  onConnect: () => {
    console.log("mekwth wd krpnko oi");
    client.subscribe("/topic/greetings", (message) =>
      console.log(`Received: ${message.body}`)
    );
    client.publish({ destination: "/topic/hello", body: "First Message" });
  },
  debug: (err) => {
    console.log(err);
  },
});

client.activate();

执行代码后,控制台仅输出以下内容,之后无任何响应,无法完成STOMP连接:

LOG Opening Web Socket...
LOG Web Socket Opened...
LOG >>> CONNECT
accept-version:1.2,1.1,1.0
heart-beat:10000,10000

已确认Postman可以正常连接该WebSocket端点,问题出在STOMP协议交互环节。


排查与解决步骤

1. 修复客户端代码冗余

原代码重复创建Client实例,会导致逻辑冲突,必须确保仅创建一个实例并调用一次activate()。

2. 验证Spring Boot STOMP配置

检查后端WebSocket配置类,确保端点、消息代理前缀配置正确:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic"); // 必须启用客户端订阅的前缀
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket") // 端点路径需与客户端brokerURL一致
                .setAllowedOrigins("*"); // 跨域配置,生产环境需限制具体域名
    }
}

3. 调整心跳配置

StompJS默认心跳为10000ms,若后端心跳配置不匹配会导致连接挂起。可在客户端临时关闭心跳测试:

const client = new Client({
  brokerURL: "ws://192.168.179.77:8080/gs-guide-websocket",
  heartbeatIncoming: 0, // 关闭入站心跳
  heartbeatOutgoing: 0, // 关闭出站心跳
  onConnect: () => {
    // ... 原有逻辑
  },
  debug: (err) => {
    console.log(err);
  },
});

4. 检查后端日志

查看Spring Boot控制台日志,确认是否存在以下问题:

  • 跨域拦截错误
  • STOMP协议版本不兼容
  • 端点路径不匹配
  • 消息代理初始化失败

5. 确认目的地路径正确性

  • 若后端通过@MessageMapping("/hello")接收消息,客户端应发布到/app/hello而非/topic/hello
  • 订阅的/topic/greetings需确保后端有代码将消息发送至该目的地,例如:
@Controller
public class GreetingController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) {
        return new Greeting("Hello, " + message.getName() + "!");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:43:14