将Mono与发射的每个Flux元素组合

时间:2018-08-17 02:18:56

标签: reactive-programming spring-webflux project-reactor

我的助焊剂和单晶如下:

Mono<MyRequest> req = request.bodyToMono(MyRequest.class);
Mono<List<String>> mono1 = req.map(r -> r.getList());;
Flux<Long> flux1 = req.map(r -> r.getVals()) // getVals() return list of Long
        .flatMapMany(Flux::fromIterable);

现在对于flux1中的每个数字,我想调用一个方法,其中params是flux1中的id和List<String>中的mono1的id。像

flux1.flatMap(id -> process(id, mono1)) 

但是传递和处理相同的mono1会导致错误Only one connection receive subscriber allowed。我该如何实现?谢谢!

1 个答案:

答案 0 :(得分:1)

由于这两个信息都来自同一来源,因此您可以使用这样的一个管道来运行整个过程,并将两个元素都包装在Tuple或更好的域对象中,该对象具有更多含义:

Mono<MyRequest> req = // ...
Flux<Tuple2<Long, List<String>>> tuples = req.flatMapMany(r ->
        Flux.fromIterable(r.getVals())
                .map(id -> Tuples.of(id, r.getList()))
);
// once there, you can map that with your process method like
tuples.map(tup -> process(tup.getT1(), tup.getT2());

请注意,这看起来很不寻常,这基本上来自于您收到的对象的结构。