Flux 响应而不是 WebSocket(Spring 启动)
Flux responce instead of WebSocket (Spring boot)
我正在编写服务,在新数据到达我的服务器时将其发送给用户。
所以服务器接收数据,这一切都将交给用户。
为此,我使用了 WebSocket。用户订阅一个主题,然后接收有关新数据的信息。
但是我在 WebFlux 中看到我们可以像在套接字中一样连续 return 数据。例如
@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 相同的逻辑吗?
例如,用户将向服务器发出请求,并在新数据到来时return响应。
您确实可以使用 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 流式传输不受原生支持)。
我正在编写服务,在新数据到达我的服务器时将其发送给用户。 所以服务器接收数据,这一切都将交给用户。 为此,我使用了 WebSocket。用户订阅一个主题,然后接收有关新数据的信息。 但是我在 WebFlux 中看到我们可以像在套接字中一样连续 return 数据。例如
@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 相同的逻辑吗?
例如,用户将向服务器发出请求,并在新数据到来时return响应。
您确实可以使用 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 流式传输不受原生支持)。