java - 如何在 Spring Reactive Websocket API 中广播消息?

标签 java spring reactive-programming spring-webflux spring-websocket

我正在开发一个简单的聊天。我非常喜欢基于 Tomcat 的 spring websocket API,但是有一个问题。 Tomcat 使用基于线程的模型。如果我有大约 500 个在线用户,tomcat 启动 200 个线程(默认值)并且我的 CPU 死机了。因此,我需要一个基于事件循环的 websocket 实现。我决定尝试使用 websockets 的全新 spring reactive 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();
    }
}

没有用于检测 connecteddisconnected 事件的 API(就像 Tomcat 那样)。因此,我无法存储可用于消息广播的 Activity session 的集合。

最佳答案

有一篇很好的文章介绍了使用 webflux 结合 websockets 实现全局聊天应用程序 how-to-build-a-chat-app-using-webflux-websockets-react . 您应该能够通过他的代码掌握 API,并对其进行修改以支持您对多个聊天室的需求。

他还描述了如何监听连接和断开“事件”。 在github上可以找到对应的项目:java-reactive-chat .

关于java - 如何在 Spring Reactive Websocket API 中广播消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962814/

相关文章:

java - 为什么实例变量是最终的?

java - 从 native 查询和转换中检索数据

java - 如何在没有 Autowiring 的情况下实例化spring data jpa存储库

android - RxJava 中的 MutableLiveData 等价物是什么?

java - Project Reactor - 有状态地组合两个发布者并发出结果

swift - 如何在定时器中设置到期时间(_ :period:scheduler:)

java - 有状态 session Bean 和 HTTP session

java - 如何根据设备制造商执行不同的代码?

java - Spring MVC 中的@SessionAttributes 何时被删除? (带代码示例)

java - 为什么当 application.properties 存在时不使用 @PropertySource ?