压缩三种不同类型的单声道
Zip Three Different Mono of Different Type
我已经使用 Spring Webflux 开始了一个新项目,我对这种反应式编码范式还很陌生。像新手一样提问提前致歉
我的控制器方法 returns 响应为 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 对象是不同类型的。
- 我可以 flatMap/map 每个 Mono 并创建一个链。但我希望在单独的线程中并行调用 service2,因为它不依赖于 service1 调用。但是 service3 调用依赖于 service1 响应。
综上所述,我需要做的事情:
- 首先调用service1
- 让service2在不同的线程上分别调用
- 进行依赖于service1调用数据的service3调用
- 使用来自所有服务调用的数据生成最终响应对象 (
Mono<ResponseEntity<String>>
)。
提前致谢。作为新手,不胜感激。
每当你压缩两个单声道时,第三个参数将是 BiFunction
但对于三参数,它 return 是 tuple
的 flatmap
然后在元组中你会得到其他 Monos 的响应。
您需要按以下方式修改您的代码。
Mono.zip(customMono, booleanMono, stringMono).flatMap(data->{
data.getT1();
data.getT2();
data.getT3();
return <your_response_object>;
});
现在 getT1()
、getT2()
和 getT3()
的 return 类型是什么?
总的来说,这将取决于您的 Zip Mono return.
希望对你有所帮助。
根据您的具体情况,您需要 Mono.zipWhen()
,这将确保您的第 3 次服务调用从服务调用 1
的响应中获得所需的数据
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};
} );
我已经使用 Spring Webflux 开始了一个新项目,我对这种反应式编码范式还很陌生。像新手一样提问提前致歉
我的控制器方法 returns 响应为 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 对象是不同类型的。
- 我可以 flatMap/map 每个 Mono 并创建一个链。但我希望在单独的线程中并行调用 service2,因为它不依赖于 service1 调用。但是 service3 调用依赖于 service1 响应。
综上所述,我需要做的事情:
- 首先调用service1
- 让service2在不同的线程上分别调用
- 进行依赖于service1调用数据的service3调用
- 使用来自所有服务调用的数据生成最终响应对象 (
Mono<ResponseEntity<String>>
)。
提前致谢。作为新手,不胜感激。
每当你压缩两个单声道时,第三个参数将是 BiFunction
但对于三参数,它 return 是 tuple
的 flatmap
然后在元组中你会得到其他 Monos 的响应。
您需要按以下方式修改您的代码。
Mono.zip(customMono, booleanMono, stringMono).flatMap(data->{
data.getT1();
data.getT2();
data.getT3();
return <your_response_object>;
});
现在 getT1()
、getT2()
和 getT3()
的 return 类型是什么?
总的来说,这将取决于您的 Zip Mono return.
希望对你有所帮助。
根据您的具体情况,您需要 Mono.zipWhen()
,这将确保您的第 3 次服务调用从服务调用 1
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};
} );