java - 压缩三种不同类型的单声道

标签 java spring-webflux reactor-netty

我已经使用 Spring Webflux 开始了一个新项目,我对这种响应式(Reactive)编码范例还很陌生。像新手一样提问,提前致歉。

我的 Controller 方法将响应返回为 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.concaWith 方法,因为我的 Mono 对象属于不同类型。
  • 我可以 flatMap/map 每个 Mono 并创建一个链。但我希望在单独的线程中并行调用 service2,因为它不依赖于 service1 调用。但 service3 调用依赖于 service1 响应。

总而言之,我需要做的是:

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

提前致谢。作为新手,欢迎任何建议。

最佳答案

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

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

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

总的来说,这取决于您的 Zip Mono 返回的内容。

希望对你有所帮助。

关于java - 压缩三种不同类型的单声道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445213/

相关文章:

c# - 如何将此 Java 代码移植到 C# 中?

java - 如何在 postgres 服务器上运行 Oak-run 控制台

java - Spring WebFlux - 为什么我必须等待 WebClient 响应?

http - 如何在 Reactor Netty 客户端中使用简单的 HTTP 代理?

websocket - 使用 Micronaut Websocket 端点从未绑定(bind)的 Flux 发送更新

java - 如何序列化要通过 Java RSocket 发送的 POJO?

java - 图的 HashMap 表示

java - 查找可能的组合数

Spring 数据 mongodb @DBRef 列表

java - CSRF token 不是使用 Webflux 生成的