英文:
Closing all WebSocket sessions using Spring GraphQL
问题
我正在开发一个Spring GraphQL项目(使用最新的spring-boot-starter-graphql),并且正在使用WebSocket建立订阅。然而,我在编程方式关闭所有WebSocket会话方面遇到了问题。
我已经查阅了文档并搜索了示例,但我无法找到针对Spring GraphQL的明确解决方案。我找到的大多数资源与一般的WebSocket实现或STOMP有关。
框架有一个处理程序(GraphQlWebSocketHandler#WebMvcSessionInfo),它包装了WebSocketSession并将其放在内部的sessionInfoMap中,不会在外部共享。
我希望在特定事件发生时,能够确保所有活动会话都被正确终止。对于任何帮助或演示该方法的代码示例,我将不胜感激。谢谢!
英文:
I'm working on a Spring GraphQL (newest spring-boot-starter-graphql) project and I'm using WebSocket to establish subscriptions. However, I'm having trouble finding a way to close all WebSocket sessions programmatically.
I've looked into the documentation and searched for examples, but I couldn't find a clear solution specific to Spring GraphQL. Most of the resources I found were related to general WebSocket implementations or STOMP.
Framework has a handler (GraphQlWebSocketHandler#WebMvcSessionInfo) that wraps WebSocketSession and places it in an internal sessionInfoMap that is not shared externally.
I want to make sure that all active sessions are properly terminated when a specific event occurs.
Any help or code examples demonstrating the approach would be greatly appreciated. Thank you!
答案1
得分: 1
我通过扩展GraphQlWebSocketHandler并在bean集合中收集WebSocket会话来找到解决方案。
@Component
class CustomGraphqlWebSocketHandler extends GraphQlWebSocketHandler {
private final Collection<WebSocketSession> sessions;
CustomGraphqlWebSocketHandler(WebGraphQlHandler graphQlHandler, HttpMessageConverter<?> mappingJackson2HttpMessageConverter,
Collection<WebSocketSession> sessions) {
super(graphQlHandler, mappingJackson2HttpMessageConverter, Duration.ofSeconds(5));
this.sessions = sessions;
}
@Override
public void afterConnectionEstablished(WebSocketSession session) {
sessions.add(session);
super.afterConnectionEstablished(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
sessions.remove(session);
super.afterConnectionClosed(session, closeStatus);
}
}
请注意,代码部分已保留在英文状态。
英文:
I found the solution by extending GraphQlWebSocketHandler and collecting web socket sessions in bean collection.
@Component
class CustomGraphqlWebSocketHandler extends GraphQlWebSocketHandler {
private final Collection<WebSocketSession> sessions;
CustomGraphqlWebSocketHandler(WebGraphQlHandler graphQlHandler, HttpMessageConverter<?> mappingJackson2HttpMessageConverter,
Collection<WebSocketSession> sessions) {
super(graphQlHandler, mappingJackson2HttpMessageConverter, Duration.ofSeconds(5));
this.sessions = sessions;
}
@Override
public void afterConnectionEstablished(WebSocketSession session) {
sessions.add(session);
super.afterConnectionEstablished(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
sessions.remove(session);
super.afterConnectionClosed(session, closeStatus);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论