使用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
相关产品推荐
相关产品推荐

