Flux 响应而不是 WebSocket (Spring boot)
Posted
技术标签:
【中文标题】Flux 响应而不是 WebSocket (Spring boot)【英文标题】:Flux responce instead of WebSocket (Spring boot) 【发布时间】:2019-05-02 18:07:54 【问题描述】:我正在编写服务,它将在新数据到达我的服务器时将其发送给用户。 所以服务器接收数据,这一切都将交给用户。 为此,我使用了 WebSocket。用户订阅一个主题,然后接收有关新数据的信息。 但是我在 WebFlux 中看到我们可以像在套接字中一样连续返回数据。例如
@GetMapping(value = "/test", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Object> testStreamOfData()
return Flux.generate(() -> "", (state, sink) -> "Hello from reactivness")
.delayElements(Duration.of(2, ChronoUnit.SECONDS));
问题是:我可以用 Flux 实现与 Socket 相同的逻辑吗?
例如,用户将向服务器发出请求,并在新数据到来时返回响应。
【问题讨论】:
【参考方案1】:您确实可以使用Flux
来通过 Spring WebFlux 流式传输数据。
Spring WebFlux 使用 "application/stream+json
媒体类型流式传输 line-delimited JSON 和 "text/event-stream"
用于服务器发送事件。前者对于服务器到服务器的通信非常有用(您需要一个支持这种格式的客户端),而后者对于服务器到浏览器的通信(浏览器本机支持)非常有用。
因此您可以将数据流式传输到多个客户端,甚至共享同一个源(您应该考虑创建Flux.share()
的单个实例)。
现在我不确定“socket”是指 TCP 套接字还是 socket.io。 TCP 套接字非常低级,如果您正在寻找类似的功能,WebFlux 支持 WebSockets。如果您正在寻找支持订阅的更高级别的传输,例如 STOMP/socket.io,那么 WebFlux 还不支持(Spring Framework 目前正在开发RSocket support)。
如果您正在研究将数据流式传输到浏览器,那么 SSE 是这里的最佳选择(因为 JSON 流不原生支持)。
【讨论】:
以上是关于Flux 响应而不是 WebSocket (Spring boot)的主要内容,如果未能解决你的问题,请参考以下文章
React.js & Flux - 在哪里注册 Websocket 事件(接收数据)的最佳位置
Azure ServiceBusSessionReceiverAsyncClient - Mono 而不是 Flux
为啥使用 Redux 而不是 Facebook Flux? [关闭]