如何在 Spring Reactive Websocket API 中广播消息?
How to broadcast messages in Spring Reactive Websocket API?
我正在开发一个简单的聊天工具。我非常喜欢基于 Tomcat 的 spring websocket API,但是有一个问题。 Tomcat 使用基于线程的模型。如果我有大约 500 个在线用户,tomcat 启动 200 个线程(默认值)并且我的 CPU 死掉了。因此,我需要一个基于事件循环的 websocket 实现。我决定尝试使用 websockets 的全新 spring 反应式 API。
所以,我需要用聊天室聊天。当某个用户在聊天室中发送消息时,必须发送给聊天室中的所有用户。
Spring 提供以下 API:
@Service
public class ChatWebSocketHandler implements WebSocketHandler {
@Override
public Mono<Void> handle(WebSocketSession session) {
Mono<Void> input = ;
Mono<Void> output = ;
return Mono.zip(input, output).then();
}
}
没有 API 用于检测 connected
和 disconnected
事件(例如,它是 Tomcat)。所以,我无法存储active sessions
的集合,可以用于消息广播
有一篇很好的文章介绍了使用 webflux 结合 websockets 实现全球聊天应用程序 how-to-build-a-chat-app-using-webflux-websockets-react。
你应该可以通过他的代码掌握API并修改它来支持你的多个聊天室的需求。
他还介绍了如何侦听连接和断开连接 "events"。
你可以在github上找到对应的项目:java-reactive-chat.
我正在开发一个简单的聊天工具。我非常喜欢基于 Tomcat 的 spring websocket API,但是有一个问题。 Tomcat 使用基于线程的模型。如果我有大约 500 个在线用户,tomcat 启动 200 个线程(默认值)并且我的 CPU 死掉了。因此,我需要一个基于事件循环的 websocket 实现。我决定尝试使用 websockets 的全新 spring 反应式 API。
所以,我需要用聊天室聊天。当某个用户在聊天室中发送消息时,必须发送给聊天室中的所有用户。
Spring 提供以下 API:
@Service
public class ChatWebSocketHandler implements WebSocketHandler {
@Override
public Mono<Void> handle(WebSocketSession session) {
Mono<Void> input = ;
Mono<Void> output = ;
return Mono.zip(input, output).then();
}
}
没有 API 用于检测 connected
和 disconnected
事件(例如,它是 Tomcat)。所以,我无法存储active sessions
的集合,可以用于消息广播
有一篇很好的文章介绍了使用 webflux 结合 websockets 实现全球聊天应用程序 how-to-build-a-chat-app-using-webflux-websockets-react。 你应该可以通过他的代码掌握API并修改它来支持你的多个聊天室的需求。
他还介绍了如何侦听连接和断开连接 "events"。 你可以在github上找到对应的项目:java-reactive-chat.