我已经学习了一些关于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
。
我想知道是否建议使用PublishSubscribeChannel
和FluxSink
将事件从后台进程推送到客户端,或者在这个特定示例中是否更方便(监视文件系统)。我想如果你可以控制后台进程,你可以让它直接发送到{{1}}吗?
我正在考虑与以下内容类似的用例:
答案 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/