Spring Reactive WebSocket –可从多个热流中进行服务

时间:2019-11-29 12:10:10

标签: java reactive-programming spring-webflux project-reactor spring-websocket

我将Spring WebFlux与反应式WebSocket一起使用,并尝试提供来自 几个热通量。外观如下:

      @Bean
      public WebSocketHandler webSocketHandler(MessageProducer<Message> messageProducer) {
        return session ->
        {
          Flux<Message> recentPosts = messageProducer.streamRecentPosts();

          Flux<Message> onLoadMorePosts = session.receive()
              .map(WebSocketMessage::getPayloadAsText)
              .map(this::toInputMessage)
              .filter(LoadMoreInputMessage.class::isInstance)
              .map(LoadMoreInputMessage.class::cast)
              .map(LoadMoreInputMessage::getLoaded)
              .flatMap(messageProducer::streamRecentPosts);

          Flux<Message> systemMessages = messageProducer.streamSystemMessages();
          Flux<Message> relevantSystemMessages = Flux.merge(recentPosts, onLoadMorePosts)
              .flatMap(post -> systemMessages
                  .filter(systemMessage -> systemMessage.getAffectedPostId() == null || post.getId().equals(systemMessage.getAffectedPostId()))
              );

          return session.send(recentPosts.map(this::stringify).map(session::textMessage))
              .and(session.send(onLoadMorePosts.map(this::stringify).map(session::textMessage)))
              .and(session.send(relevantSystemMessages.map(this::stringify).map(session::textMessage)));
        };
      }

每个流都有自己的处理器来推送数据。 建立连接后,所有消息均可以正确处理,但问题是没有发出新消息,这完全违背了WebSocket的目的。我发现问题可能出在Flux.merge,但摆脱它似乎没有任何作用。

感谢您的帮助。

0 个答案:

没有答案