拉链三种不同的单声道,不同类型的

2022-09-02 23:32:02

我已经使用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("-----"));
});

问题是,没有这样的方法可以采用3和函数作为参数。我已经找到了这个 - 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 -zipMono

但它不符合我的要求。所以我面临的问题

  • 我不能使用Mono.mergeWithMono.concaWith方法,因为我的Mono对象是不同类型的。
  • 我可以平面映射/映射每个Mono并创建一个链。但是我希望在单独的线程中并行调用service2,因为它不依赖于service1调用。但 service3 调用依赖于 service1 响应。

总之,我需要做的是:

  • 首先拨打 service1 电话
  • 在不同的线程上分别调用 service2
  • 进行依赖于 service1 调用数据的 service3 调用
  • 使用来自所有服务调用的数据生成最终响应对象 ()。Mono<ResponseEntity<String>>

提前致谢。作为新手,任何建议都是值得赞赏的。


答案 1

每当您压缩两个单声道时,第三个参数将是,但对于三个参数,它将返回一个,然后在元组中,您将获得其他单声道的响应。您需要按以下方式修改代码。BiFunctionflatmaptuple

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

现在,和 的返回类型是什么?getT1()getT2()getT3()

显然,这将取决于您的Zip Mono返回的内容。

希望它能帮助你。


答案 2

对于您的特定条件,您需要确保第 3 个服务呼叫将具有来自服务呼叫 1 的响应所需的数据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};
} );

推荐