不同类型的三个单声道文件如何进行压缩?

25

我开始使用Spring Webflux启动一个新项目,对于这种响应式编程范式我还是新手。所以提前道歉,如果我的问题像个新手那样。

我的控制器方法返回Mono<ResponseEntity<String>>类型的响应,并且我有三个不同的服务要调用,从中我得到了三个不同的Mono对象,像这样 -

Mono<CustomObject> customMono = serivce1.method();
Mono<Boolean> booleanMono = service2.method();
Mono<String> stringMono = service3.method();

因此,为了准备响应(Mono<ResponseEntity<String>>),我需要这样做 -

Mono.zip(customMono, booleanMono, stringMono, (customData, booleanData, stringData) -> {
------
return Mono.just(ResponseEntity.ok().body("-----"));
});
问题在于,没有这样的zip方法来接受3个Mono和一个函数作为参数。 我已经找到了这个- https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#zip-reactor.core.publisher.Mono-reactor.core.publisher.Mono-java.util.function.BiFunction-
但它不满足我的要求。 所以我面临的问题:
- 我不能使用Mono.mergeWithMono.concatWith方法,因为我的Mono对象是不同类型的。 - 我可以flatMap/map每个Mono并创建一个链条。 但我希望service2在单独的线程中并行调用,因为它不依赖于service1调用。 但是service3调用取决于service1响应。 - 总之,我需要做的是:
- 首先进行service1调用 - 在不同的线程上单独进行service2调用 - 进行依赖于service1调用数据的service3调用 - 使用所有服务调用的数据生成最终响应对象(Mono<ResponseEntity<String>>)。
谢谢您提前的帮助。 作为新手,欢迎任何建议。
3个回答

33

每当您压缩两个单声道时,第三个参数将是BiFunction,但具有三个参数,则返回tupleflatmap,然后在元组中您将获得其他单声道的响应。

您需要按以下方式修改您的代码。

Mono.zip(customMono, booleanMono, stringMono).flatMap(data->{
 data.getT1();
 data.getT2();
 data.getT3();
 return <your_response_object>;
});

现在getT1()getT2()getT3()的返回类型将取决于你的Zip Mono返回什么。

希望这能帮到你。


你能否提供一种方法来并行/异步调用service2?当我调用Mono.zip方法时,我希望service2的响应立即准备好以供使用。 - bivrantoshakil
我认为Yash的回答以下是相同的解决方案。 - Pratik Bhajankar
1
你能否澄清一下为什么要使用 flatMap 而不是 map,并且 Mono.just 在结尾做了什么,相比于直接返回 <your_response_object> - Marco Lackovic
3
当有超过8个单声道时该怎么办? 单声道.zip 的最大值为8。 - Gaudam Thiyagarajan
@GaudamThiyagarajan,接下来您需要调用data.getT8(),希望它能正常工作。压缩至8个元素并请求数据到T8()。 - Pratik Bhajankar

18

针对您的具体情况,您需要使用Mono.zipWhen(),这将确保您的第三个服务调用从第一个服务调用的响应中获得所需的数据

Mono.zip(monoResponse1,monoResponse2).zipWhen(data ->serviceCall3(data.getT1())).flatMap(response ->{
    response.getT1().getT1();//response from mono1
    response.getT1().getT2();//response from mono 2
    response.getT2();//response from mono 3
    return {create your mono response here};
} );

谢谢。您能否建议一种方法,如何使service2调用并行/异步?当我调用Mono.zip方法时,我希望service2的响应立即可用。 - bivrantoshakil
你可以通过使用data.getT2()直接使用service2的响应。 - yash sugandh

0
我也正在学习响应式编程阶段。所以我从对两个方法进行zipWith开始,然后开始思考如果我想要对多个方法进行zipWith怎么办!
我发现我可以将方法与另一个zipWith链接起来。
greet().zipWith(name()).map(tuple -> tuple.getT1() + tuple.getT2())
                                        .zipWith(name2()).map(tuple -> tuple.getT1() + tuple.getT2());

解释:greet()返回一个String Mono,我将其与name()进行了压缩。然后,我再次将第一个map()返回的Mono与第三个方法name2()进行了压缩,并再次进行了map操作以获得所需的响应。
这只是另一种压缩多个方法的方式。但是,这并不能解决所有问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接