使用 Spring 5 的反应式 WebSockets - 如何获取初始消息

Posted

技术标签:

【中文标题】使用 Spring 5 的反应式 WebSockets - 如何获取初始消息【英文标题】:Reactive WebSockets with Spring 5 - how to get initial message 【发布时间】:2018-02-13 09:12:59 【问题描述】:

我遵循了该教程(特别是浏览器 WebSocket 客户端的部分):http://www.baeldung.com/spring-5-reactive-websockets 一切正常。

我想更进一步,让我的处理程序根据客户端发送的参数运行。在连接时,客户端正在发送一条消息(“event-me-from-browser”):

var clientWebSocket = new WebSocket("ws://localhost:8080/event-emitter");
clientWebSocket.onopen = function() 
    console.log("clientWebSocket.onopen", clientWebSocket);
    console.log("clientWebSocket.readyState", "websocketstatus");
    clientWebSocket.send("event-me-from-browser");

我试图在服务器端(java)检索该消息:

@Override
public Mono<Void> handle(WebSocketSession webSocketSession) 

   webSocketSession.receive().handle((pWebSocketMessage, pSynchronousSink) -> System.out.println(pWebSocketMessage.getPayloadAsText()));

   return webSocketSession.send(Flux.fromStream(Stream.generate(() -> getData()))
         .delayElements(Duration.ofMillis(50))
         .map(webSocketSession::textMessage))
         .and(webSocketSession.receive()
               .map(WebSocketMessage::getPayloadAsText)
               .log());

但它不起作用。

有什么想法吗?我做错了什么?

【问题讨论】:

【参考方案1】:

排除 tomcat 依赖(并使用 netty 代替)将起作用:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- Exclude the Tomcat dependency -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

【讨论】:

【参考方案2】:

我遇到了同样的问题。我相信这可能与 Spring Boot 自动导入的模块有关,特别是 Tomcat。

我关注了这个视频https://www.youtube.com/watch?v=GlvyHIqT3K4,并且 websockets 使用以下堆栈立即工作:

Netty(不是 Tomcat) Spring Boot 2.0.x spring-boot-starter-parent 弹簧集成spring-boot-starter-integration Spring WebFlux(反应式)spring-boot-starter-webflux

【讨论】:

以上是关于使用 Spring 5 的反应式 WebSockets - 如何获取初始消息的主要内容,如果未能解决你的问题,请参考以下文章

[转] 使用 Spring 5 的 WebFlux 开发反应式 Web 应用

Spring 5 反应式异常处理

每日阅读2020年7月14日-使用 Spring 5 的 WebFlux 开发反应式 Web 应用

Spring 5 之 WebFlux 开发反应式 Web 应用

Spring 5的Servlet和反应式技术栈解析

反应式的Spring 5