WebClient如何刷新部分接收到的数据?

时间:2018-09-03 10:21:13

标签: spring-boot spring-webflux reactor-netty

我想对接收到的内容进行部分刷新。例如,我有处理程序:

return client
    .post()
    .body(BodyInserters.fromDataBuffers(
        request.body(BodyExtractors.toDataBuffers())))
    .exchange()
    .....

当接收到一定数量的数据缓冲区时,如何强制刷新?

1 个答案:

答案 0 :(得分:0)

首先,对此要发出警告:

  • 默认情况下(即,如果您不手动刷新),只要通道准备好并且刷新策略认为很方便,Netty就会不时缓冲字节并刷新它们。这是针对性能进行优化的。

  • 如果要手动刷新,则不能保证另一端将以相同方式接收这些字节组;中间人可能会沿途缓冲事情。这可能无法实现您要执行的操作:手动刷新通常与性能优化无关,而与协议语义有关。

  • 使用手动刷新策略仅在将其与协议语义(例如消息分隔符)配对时才有用,以便对方知道如何分割消息(这是Spring WebFlux对SSE和{{ 1}}。

现在要实现这一点,Reactor为多个application/streaming+json运算符提供了不同的策略。 windowXYZ基于元素的数量,Flux.window(int)基于持续时间,等等。在这种情况下,您可能需要使用windowTimeout(Duration)

让我们尝试实现在缓冲了一定数量的数据后刷新的东西。

windowUntil(Predicate)

请注意,如果您要处理无限的数据流,则实现有缺陷:在达到配额或完成源操作之前,该刷新将不会刷新。因此,这可能会使数据保留不必要的时间。