【发布时间】:2020-02-15 02:49:54
【问题描述】:
我已经使用 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.concaWith 方法,因为我的 Mono 对象属于不同类型。
- 我可以对每个 Mono 进行平面映射/映射并创建一个链。但我希望 service2 在单独的线程中被并行调用,因为它不依赖于 service1 调用。但 service3 调用依赖于 service1 响应。
总结一下,我需要做的事情:
- 首先调用 service1
- 在不同的线程上分别调用 service2
- 进行依赖于 service1 调用数据的 service3 调用
- 使用来自所有服务调用的数据生成最终响应对象 (
Mono<ResponseEntity<String>>)。
提前致谢。作为新手,欢迎提出任何建议。
【问题讨论】:
标签: java spring-webflux reactor-netty