Flux响应而不是WebSocket(春季启动)

时间:2018-11-30 15:04:07

标签: spring-boot spring-webflux reactive

我正在编写服务,该服务将在服务器上发送新数据给用户。 因此,服务器接收数据,所有这些都将交给用户。 我已经为此目的使用了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 个答案:

答案 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流)。