我想对接收到的内容进行部分刷新。例如,我有处理程序:
return client
.post()
.body(BodyInserters.fromDataBuffers(
request.body(BodyExtractors.toDataBuffers())))
.exchange()
.....
当接收到一定数量的数据缓冲区时,如何强制刷新?
答案 0 :(得分:0)
首先,对此要发出警告:
默认情况下(即,如果您不手动刷新),只要通道准备好并且刷新策略认为很方便,Netty就会不时缓冲字节并刷新它们。这是针对性能进行优化的。
如果要手动刷新,则不能保证另一端将以相同方式接收这些字节组;中间人可能会沿途缓冲事情。这可能无法实现您要执行的操作:手动刷新通常与性能优化无关,而与协议语义有关。
使用手动刷新策略仅在将其与协议语义(例如消息分隔符)配对时才有用,以便对方知道如何分割消息(这是Spring WebFlux对SSE和{{ 1}}。
现在要实现这一点,Reactor为多个application/streaming+json
运算符提供了不同的策略。 windowXYZ
基于元素的数量,Flux.window(int)
基于持续时间,等等。在这种情况下,您可能需要使用windowTimeout(Duration)
。
让我们尝试实现在缓冲了一定数量的数据后刷新的东西。
windowUntil(Predicate)
请注意,如果您要处理无限的数据流,则实现有缺陷:在达到配额或完成源操作之前,该刷新将不会刷新。因此,这可能会使数据保留不必要的时间。