我将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
,但摆脱它似乎没有任何作用。
感谢您的帮助。