关于我之前的问题Splitting a WebClient Post of a Streaming Flux into JSON Arrays,我正在使用;
myFlux
.window(5)
.flatMap(window -> client
.post()
.body(window, myClass.class)
.exchange()
.flatMap(response -> response.bodyToMono)
)
.subscribe();
这很好。但是,在缓慢的一天中,有5条消息会花一段时间才能到达,window
在window
已满之前不会发送任何消息。所以
我切换到windowTimeout(5, Duration.ofSeconds(5))
。
现在,如果没有数据并且超出了Duration
,则代码将传播一个空的window
,这将导致发布一个空数组。
如何检测到空的window
并且不运行post
?
答案 0 :(得分:1)
不幸的是,如果不阅读完整的Flux,就无法知道Flux将发射多少物品。
由于窗口大小较小,因此可以使用List
将Flux发出的所有项目收集到.collectList()
中,然后在发送请求之前检查列表是否为空。
myFlux
.windowTimeout(5, Duration.ofSeconds(5))
.flatMap(window ->
// collect everything in the window into a list
window.collectList()
// ignore empty windows
.filter(list -> !list.isEmpty())
// send the request
.flatMap(list -> client
.post()
.body(Flux.fromIterable(list), MyClass.class)
.exchange()
.flatMap(response -> response.bodyToMono(MyResponse.class))))