当前位置: 首页 > 知识库问答 >
问题:

等待所有Mono响应从下游API返回的正确方法是什么

澹台硕
2023-03-14

我对Mono和Flux很陌生。我正在尝试加入几个下游API响应。这是一个传统的阻塞应用程序。我不想收集Mono的列表,我想要一个从下游API返回的有效负载列表,我从Mono获取。然而,有时返回给控制器的“结果”只有部分或没有下游API响应。正确的方法是什么?我读过几篇关于如何迭代通量和混合单态的帖子

您不应该在web应用程序中的任何位置调用subscribe。如果这是绑定到HTTP请求的,则基本上是触发反应性管道,而不保证资源或完成。调用subscribe会触发管道,但不会等到它完成

我应该使用CompletableFuture吗?

在我的服务中,我尝试

var result = new ArrayList<List<>>();
List<Mono<X>> monoList = apiCall();
Flux.fromIterable(monoList)
            .flatMap(m -> m.doOnSuccess(
                        x -> {  
                            result.add(x.getData());
                        }
        )).subscribe();

我还尝试在controller中执行以下操作,但该方法返回时不等待subscribe完成

var result = new ArrayList<List<X>>();
        Flux.concat(
                this.service.callApis(result, ...)
        ).subscribe();
        return result;

在我的服务中

public Mono<Void> callApis(List<List<x>> result, ..) {
...
return Flux.fromIterable(monoList)
                .flatMap(m -> m.doOnSuccess(
                        x -> {  
                            result.add(x.getData()...);
                        }
                )).then();

共有1个答案

孟高峰
2023-03-14

项目反应器留档(这是非常好的)有一个部分,称为我需要哪个运算符?。您需要从您的API调用中创建一个Flux,组合结果,然后返回同步世界。

在您的情况下,您的所有下游服务似乎都有相同的API,因此它们都返回相同的类型,并且这些响应在应用程序中的显示顺序并不重要。此外,我假设apiCall()返回一个列表

Flux.fromIterable(apiCall()) // Flux<Mono<Response>>
    .flatMap(mono -> mono) // Flux<Response>
    .map(response -> response.getData()) // Flux<List<X>>
    .collectList() // Mono<List<List<X>>>
    .block(); // List<List<X>>

fromIterable(...)。平面图(x-

map()用于提取响应的数据部分。

collectList()创建一个等待流量完成的单声道,并给出一个包含所有数据列表的结果。

block()订阅上一个操作符返回的单声道,并一直阻塞到它完成为止,在这种情况下,将在apiCall()返回的所有单声道完成时执行。

这里有许多可能的替代方案,哪个最合适将取决于您的确切用例。

 类似资料:
  • 什么是REST API响应结构和布局的最佳实践? Scrath示例: 成功回应: 失败响应:

  • 我正在使用Spring Webflow R2DBC将一些数据插入数据库。 要求提供数据- 控制器 服务 道 主要问题是我不知道如何让它等待所有结果返回并添加到最终

  • 如何正确处理由期货构建的Monos? 我试着让我的头脑围绕着Spring Reactive(和Spring 5),观看所有的视频,阅读所有我能找到的博客,但他们似乎都没有做一些事情,而不仅仅是查询数据库或其他琐碎的事情。 我正在使用新的AWS 2.0开发工具包,它使用的用于大多数事情。使用服务创建新实例,我的方法如下所示 我在这里的理解是,我几乎立即返回类型的,而将随时执行它的操作。 我从我的路由

  • 你知道我在这里做错了什么吗?我怎么能让它工作。?!

  • 问题内容: 我在一个页面内有一个iframe,该页面正在不断地轮询服务器以获取正在由“主要” XHR主动更新的会话变量。 所以基本上: 主XHR运行并完成其任务,并在运行时更新会话变量。通常需要一段时间,例如超过10秒。 当主要XHR运行时,我使用并行XHR请求在服务器上轮询相同的会话变量。每当我收到来自轮询XHR的响应时,就应该更新前端视图。 问题在于,轮询XHR直到主XHR完成后才返回任何内容

  • 问题内容: 我想知道退出程序之前等待go例程完成的正确方法是什么。阅读其他答案,看来bool chan可以解决问题,就像在Playground链接中一样 我在这里有两个问题: 为什么<-完成的作品完全可以? 如果我取消最后一行的注释会怎样?我有一个死锁错误。这是因为通道为空,并且没有其他函数向其发送值吗? 问题答案: 为何一切正常? 之所以有效,是因为运行时检测到您正在向其他地方的通道写入内容。