Spring 5 Reactive WebSockets:推荐使用

时间:2017-10-05 20:28:52

标签: spring websocket reactive-programming spring-webflux

我已经学习了一些关于Spring 5 WebFlux,反应式编程和websockets的知识。我已经看过Josh Long的Spring Tips: Reactive WebSockets with Spring Framework 5了。通过WebSocket连接将数据从服务器发送到客户端的代码使用发布到IntegrationFlow的Spring Integration PublishSubcribeChannel,该MessageHandler订阅了一个自定义FluxSink的消息,转换它到一个对象,然后转换为Json并从提供给Flux.create()的回调发送到WebSocketConnection,用于发送到IntegrationFlow

我想知道是否建议使用PublishSubscribeChannelFluxSink将事件从后台进程推送到客户端,或者在这个特定示例中是否更方便(监视文件系统)。我想如果你可以控制后台进程,你可以让它直接发送到{{1}}吗?

我正在考虑与以下内容类似的用例:

  • 监控进度的机器学习过程
  • 更新发送给玩家的游戏世界状态
  • 聊天室/团队协作软件
  • ...

2 个答案:

答案 0 :(得分:0)

由于这个问题,Spring引入了RSocket support-您可能会想到它,就像Spring MVC中现有的WebSocket STOMP支持一样,但是功能更强大,效率更高,在协议级别上支持背压和高级通信模式。

对于您提到的用例,我建议您使用RSocket,因为您将获得带有@MessageMapping的强大编程模型以及Spring中所有预期的支持(JSON和CBOR的编解码器,安全性等)。 )。

答案 1 :(得分:0)

过去对我有用的工作是创建一个实现WebSocketHandler的Spring组件:

@Component
public class ReactiveWebSocketHandler implements WebSocketHandler {

然后在handle方法中,Spring注入WebSocketSession对象

@Override
public Mono<Void> handle(WebSocketSession session) {

然后创建一个或多个Flux反应性发布者,这些发布者为客户端发出消息(WebSocketMessage)。

    final var output = session.send(Flux.merge(flux1, flux2));

然后,您可以将传入和传出的Flux对象压缩到Mono中,然后Spring将从那里获取它。

        return Mono.zip(incomingWebsocketMsgResponse.getWebSocketMsgFlux().then(),
                outputWithErrorMsgs)
                .then();

示例:https://howtodoinjava.com/spring-webflux/reactive-websockets/