我开始使用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.mergeWith或Mono.concatWith方法,因为我的Mono对象是不同类型的。 - 我可以flatMap/map每个Mono并创建一个链条。 但我希望service2在单独的线程中并行调用,因为它不依赖于service1调用。 但是service3调用取决于service1响应。 - 总之,我需要做的是:
- 首先进行service1调用 - 在不同的线程上单独进行service2调用 - 进行依赖于service1调用数据的service3调用 - 使用所有服务调用的数据生成最终响应对象(
Mono<ResponseEntity<String>>
)。谢谢您提前的帮助。 作为新手,欢迎任何建议。
flatMap
而不是map
,并且Mono.just
在结尾做了什么,相比于直接返回<your_response_object>
? - Marco Lackovic