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

