使用groupBy的Flux并行串行执行

时间:2019-04-08 22:47:26

标签: java project-reactor

说我有这个:

Flux<GroupedFlux<Integer, Integer>> intsGrouped = Flux.range(0, 12)
   .groupBy(i -> i % 3);

说我有一种方法:

Mono<Integer> getFromService(Integer i);

我想为每个组并行呼叫getFromService,但请确保每个组内的呼叫是串行的。

对于上面的示例,将是具有这些输入值的三个并行流:

stream 1: 0 -> 3 -> 6 -> 9
stream 2: 1 -> 4 -> 7 -> 10
stream 3: 2 -> 5 -> 8 -> 11

我尝试了此操作,但它没有满足我的要求:

Flux.range(0, 12)
   .groupBy(i -> i % 3)
   .flatMap(g -> g.flatMap(i -> getFromService(g.key(), i)))

这一次为所有int并行调用服务。我该如何进行?

1 个答案:

答案 0 :(得分:1)

使用concatMapflatMapSequential代替内部的.flatMap

如果您要在每个组中顺序执行 (即,每个组中一次仅getFromService的一个订阅),请使用.concatMap,如下所示:< / p>

Flux.range(0, 12)
   .groupBy(i -> i % 3)
   .flatMap(g -> g.concatMap(i -> getFromService(g.key(), i)))

如果在一个组内并行执行是 ok ,但是您只关心序列的发出顺序,则使用flatMapSequential,如下所示:

Flux.range(0, 12)
    .groupBy(i -> i % 3)
    .flatMap(g -> g.flatMapSequential(i -> getFromService(g.key(), i)))

另一种选择是在将.flatMap参数设置为concurrency的情况下使用1,但我建议您使用上述方法之一。