在Webclient发布之前检测到空的通量窗口

时间:2019-06-04 04:25:25

标签: java spring-webflux project-reactor reactive-streams

关于我之前的问题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条消息会花一段时间才能到达,windowwindow已满之前不会发送任何消息。所以 我切换到windowTimeout(5, Duration.ofSeconds(5))

现在,如果没有数据并且超出了Duration,则代码将传播一个空的window,这将导致发布一个空数组。

如何检测到空的window并且不运行post

1 个答案:

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