微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Webflux - 如何从 Mono/Flux 多次检索值而不进行多次调用来获取那些 Mono/Flux

如何解决Spring Webflux - 如何从 Mono/Flux 多次检索值而不进行多次调用来获取那些 Mono/Flux

我正在使用 Spring Webflux & reactor、Java 11、Spring boot 2.4.5、Spring 5.3.6 版本来处理这个响应式应用程序。
用例:
我需要调用 API 并从中获取数据。从这些数据中,我获取 uniqueId 然后调用一堆 API 来获取其他数据,最后将所有这些数据组合到新对象中并返回。
示例代码

Mono<Response> 1stAPIResponse = 1stAPI.callMethod(eventId); // response object has ProductId,and other details.
Mono<List<String>> productIds = 1stAPIResponse.map(Response::ProductId).collect(Collectors.toList());

Mono<2ndAPIResponse> 2ndAPIResponse = productIds.flatMap(ids -> 2ndAPI.callMethod(ids));
Mono<3rdAPIResponse> 3rdAPIResponse = productIds.flatMap(ids -> 3rdAPI.callMethod(ids));
...

1stAPIResponse.foreach(response -> {
    FinalResponse.builder()
    .productId(response.productId)
    .val1(2ndAPIResponse.get(response.productId))
    .val3(3ndAPIResponse.get(response.productId))
    . ...
    .build()});

这里的问题是,当 ids 传递给 2ndAPI、3rdAPI、... 方法时,它每次都会调用 1stAPI 并获取数据。最后,在创建对象时,它会再次调用一个 API。在这个例子中,它总共进行了 3 次调用

如何避免发生类似的多次调用

避免这种情况的一种方法是,我可以阻止 1stAPI 调用,但它正确吗?它不会打败非阻塞式编码吗?
例如:Response 1stAPIResponse = 1stAPI.callMethod(eventId).toFuture().get();

如何编写正确的响应式程序(无阻塞)但仍然只调用 1stAPI 一次?

如有任何问题,请告诉我。

解决方法

因此,您需要以更具反应性的方式重构您的代码,并使用 zip 运算符进行并行调用:

1stAPI.callMethod(eventId)
    .flatmap(response -> // collect your id to list (ids);
     return 2ndAPI.callMethod(ids).zipWith(3ndAPI.callMethod(ids))
         .flatmap(tuple2 ->   FinalResponse.builder() // tuple contains result of 2ndAPI and 3ndAPI
                                  .productId(response.productId)
                                  .val1(2ndAPIResponse.get(response.productId))
                                  .val3(3ndAPIResponse.get(response.productId)))
                                  ... 
     )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。