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

SpringBoot中GraphQL Subscription首次可用,后续调用立即1000正常关闭

SpringBoot GraphQL Subscription 重复订阅连接立即关闭(1000 Normal Closure)的解决办法

问题现象

  • 应用启动后第一次在Postman里执行订阅查询完全正常,触发事件时能正常接收数据
  • 第二次执行订阅时,WebSocket连接直接以1000(Normal Closure)状态关闭

排查与解决步骤

1. 检查订阅实例的复用问题

看看你代码里的订阅发布器(比如用Flux实现的部分)是不是全局单例的。如果首次订阅占用了唯一的会话资源,后续请求就没法创建新连接了。要确保每个订阅请求都能拿到独立的订阅实例,别复用已经关闭的会话对象。

2. 调整Postman的连接设置

Postman有时候会复用之前的WebSocket连接,你可以先手动关闭Postman里已有的WebSocket连接,再发起新订阅。如果有「每次请求新建连接」的选项,直接开启这个设置,保证每次订阅都是全新的连接。

3. 校验SpringBoot的WebSocket配置

检查你的WebSocketMessageBrokerConfigurer配置是否正确:

  • 确认端点配置支持多连接,跨域设置(如果需要)是否放开
  • 别设置过短的会话超时时间,避免首次订阅的会话没释放就被回收
  • 参考正确的配置示例:
    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/graphql").setAllowedOriginPatterns("*").withSockJS();
        }
    
        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry.enableSimpleBroker("/topic");
            registry.setApplicationDestinationPrefixes("/app");
        }
    }
    

4. 检查数据流发布逻辑

确认你的订阅数据流(比如Flux对象)是不是在首次订阅结束后就被关闭了。比如用Flux.create的时候,要保证每次订阅都生成新的数据流,别复用已经完成的Flux实例,否则后续请求拿不到有效数据,连接就直接关闭了。

5. 开启日志排查细节

在application.properties里添加DEBUG级别日志,查看连接建立和关闭的具体原因:

logging.level.org.springframework.web.socket=DEBUG
logging.level.com.graphql.spring=DEBUG

从日志里能看到第二次订阅时连接关闭的触发点,有没有异常或者主动关闭的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:41:10