有没有办法强制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.MAX
或Integer.MAX
并发来解决这个问题 - 但是有没有办法控制群体的“生命”?
答案 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();