我正在编写服务,该服务将在服务器上发送新数据给用户。 因此,服务器接收数据,所有这些都将交给用户。 我已经为此目的使用了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相同的逻辑吗?
例如,用户将向服务器发出请求,并在收到新数据时返回响应。
答案 0 :(得分:1)
您确实可以使用Flux
通过Spring WebFlux传输数据。
Spring WebFlux正在使用"application/stream+json
媒体类型来流传输line-delimited JSON和"text/event-stream"
来发送服务器已发送事件。前者对于服务器到服务器的通信非常有用(您需要支持此格式的客户端),而后者对于服务器到浏览器的通信(浏览器本来就支持)。
因此,您可以将数据流式传输到许多客户端,甚至共享同一源(您应考虑创建Flux.share()
的单个实例)。
现在,我不确定“套接字”是指TCP套接字还是socket.io。 TCP套接字是相当底层的,如果您正在寻找类似的功能,则WebFlux支持WebSocket。如果您正在寻找支持订阅的STOMP / socket.io之类的更高级别的传输,那么WebFlux尚不支持该传输(Spring框架目前正在RSocket support上运行)。
如果您正在考虑将数据流传输到浏览器,那么SSE是此处的最佳选择(因为本机不支持JSON流)。