以下是将Flux拆分为不同处理路径并将它们连接起来的正确/惯用方法 - 出于问题的目的,不应丢弃事件,排序不重要,内存不受限制。
Flux<Integer> beforeFork = Flux.range(1, 10);
ConnectableFlux<Integer> forkPoint = beforeFork
.publish()
;
Flux<String> slowPath = forkPoint
.filter(i -> i % 2 == 0)
.map(i -> "slow"+"_"+i)
.delayElements(Duration.ofSeconds(1))
;
Flux<String> fastPath = forkPoint
.filter(i -> i % 2 != 0)
.map(i -> "fast"+"_"+i)
;
// merge vs concat since we need to eagerly subscribe to
// the ConnectableFlux before the connect()
Flux.merge(fastPath, slowPath)
.map(s -> s.toUpperCase()) // pretend this is a more complex sequence
.subscribe(System.out:println)
;
forkPoint.connect();
我想如果filter()函数慢于%,我也可以groupBy()然后在key()上使用filter()。
请注意,我确实希望slowPath和fastPath使用来自beforeFork点的相同事件,因为beforeFork生成起来很慢。
请注意,我确实有一个更复杂的后续(即更改为range(1,100)
并且预取边界周围的行为让我感到困惑) - 但我只有在上述代码段合法的情况下才有意义。