Reactor 3.x - 限制groupBy Flux

时间:2017-12-19 19:02:11

标签: project-reactor

有没有办法强制groupBy()生成的Flux在一段时间后完成(或类似地,限制“开放”组的最大数量),而不管上游的完整性如何?我有以下内容:

Flux<Foo> someFastPublisher;

someFastPublisher
  .groupBy(f -> f.getKey())
  .delayElements(Duration.ofSeconds(1)) // rate limit each group
  .flatMap(g -> g) // unwind the group
  .subscribe()
;

并且我遇到了Flux挂起的情况,假设因为组的数量大于flatMap的并发性。我可以增加flatMap并发性,但没有简单的方法可以告诉最大可能的大小。相反,我知道按Foo分组的Foo.key将在时间/发布顺序上彼此接近,而宁愿在groupBy Flux与flatMap并发上使用某种时间窗口(最后用两个不同的组与同一个key()结束并不是什么大问题。)

我猜测groupBy通量不会在完成someFastPubisher onCompletes之前完成 - 即通量传递到flatMap只是保持“开放”(尽管他们不太可能永远得到一个新的事件。)

我可以通过在groupBy中预取Integer.MAXInteger.MAX并发来解决这个问题 - 但是有没有办法控制群体的“生命”?

1 个答案:

答案 0 :(得分:4)

是的:您可以将take(Duration)应用于群组,以确保它们提前关闭,并且在此之后将打开具有相同密钥的新群组:

source.groupBy(v -> v.intValue() % 2)
      .flatMap(group -> group
              .take(Duration.ofMillis(1000))
              .count()
              .map(c -> "group " + group.key() + " size = " + c)
      )
      .log()
      .blockLast();