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

使用SpringWebFlux的第一次调用的结果进行多个异步调用

韩单弓
2023-03-14

我需要进行异步调用,并使用其中存在的一些值对同一服务进行多次调用。将这些调用的响应与第一个调用结合起来,然后返回。

例如,当我第一次调用时,我会在JSON下面看到一个ID列表。现在,我必须使用这些ID对一个服务进行多次调用,并列出它们的响应列表,然后通过在同一个JSON中添加它们将其发送到下游。

 {“id”: 145,
    “object”:[{“id”:111}]
    }

我试过使用zipWhen和

Flux.fromIterable(userIds).parallel().runOn(Schedulers.elastic()).flatMap()

但是结果列表总是以空或空的形式出现。我们如何才能做到这一点?我是不是漏了什么?

Edit1:通过使用Flux.fromIterable解决它。阅读更多关于它的信息,最终理解了它的用途并解决了它。下面的方法占用列表中的一个项目,并将调用将调用多个API的内部方法:

return Flux.fromIterable(somelist).flatMap(listItem -> {
    return someMethodToCallAnotherAPIUsingZipWith(listItem);
    }).collectList();

内部方法:它调用第一个API,将其结果传递给zipWith,使用此结果我们可以调用另一个API,也可以简单地将其与响应一起使用。

private Mono<Object> someMethodToCallAnotherAPIUsingZipWith(String listItem) {
        return authService.getAccessToken().flatMap(accessToken ->
                webClient.get().uri(builder -> builder.path("/path").build(listItem))
                        .header(HttpHeaders.AUTHORIZATION, accessToken)
                        .retrieve()
                        .toEntity(Entity.class).log()
                        .flatMap(entity -> {
                            //manipulate your response or create new object using it
                            return Mono.just(entity);
                        }).zipWhen(consent -> webClient.get().uri(builder -> builder.path("/otherpath").build(listItem))
                        .header(HttpHeaders.AUTHORIZATION, accessToken)
                        .retrieve().bodyToMono(Entity.class).log()
                        .flatMap(entity -> {
                            //example
                            listItem = entity.getString();
                            return Mono.just(listItem);
                        }), (string1, string2) -> string1 + string2));
    }

共有1个答案

姬乐池
2023-03-14
private Mono<Object> someMethodToCallAnotherAPIUsingZipWith(String listItem) {
    return authService.getAccessToken().flatMap(accessToken ->
            webClient.get().uri(builder -> builder.path("/path").build(listItem))
                    .header(HttpHeaders.AUTHORIZATION, accessToken)
                    .retrieve()
                    .toEntity(Entity.class).log()
                    .flatMap(entity -> {
                        //manipulate your response or create new object using it
                        return Mono.just(entity);
                    }).zipWhen(consent -> webClient.get().uri(builder -> builder.path("/otherpath").build(listItem))
                    .header(HttpHeaders.AUTHORIZATION, accessToken)
                    .retrieve().bodyToMono(Entity.class).log()
                    .flatMap(entity -> {
                        //example
                        listItem = entity.getString();
                        return Mono.just(listItem);
                    }), (string1, string2) -> string1 + string2));
}
 类似资料:
  • 问题内容: 使用promise API,如何并行发送两个异步请求,以及如何将合并的结果解析为响应。 现在,当我像这样调用get()时 我需要获得指示的合并结果。如何使用Angular promise API做到这一点? 问题答案: 正如@Matt所说,您需要使用,但用法并不完全正确。AngularJS不支持,并且它们无论如何都不能那样工作,因为没有诸如对多个值的承诺之类的东西,相反,您仅对数组有一

  • 我调用了多个ajax调用,但代码只在所有ajax调用执行之后才到达API。 JavaScript: AppFactory API 链接工作很好,但我需要运行两个独立,我真的想知道发生了什么。 谢谢!!!

  • 问题内容: 根据该文件对中,它说: 以ResultSet对象的形式检索当前结果。每个结果仅应调用此方法一次。 使用一些测试代码,我运行并多次调用,并观察到返回的对象指向同一个对象。因此,我猜测它不会返回您需要单独关闭的其他内容。但是,当然这对于我的JDBC驱动程序可能是唯一的。 纵观文档的,它说: 默认的ResultSet对象是不可更新的,并且具有仅向前移动的光标。因此,您只能迭代一次,并且只能从

  • 我正在使用的应用程序将按以下顺序使用2个REST web服务: 1) 计数记录-了解特定时间范围内的记录数。 2)获取记录——一旦我们有了记录的数量,我们就需要调用这项服务。但是这项服务有一个门槛来一次性获取10K记录。假设第一个服务在特定的时间间隔内告诉我,它有100K的记录,那么我需要以分页方式调用第二个网络服务10次,考虑到它的阈值是一次10K的。 因此,如果我将进行10次同步调用,我的应用

  • 我搜索了许多网站和文档,但异步调用使用的代码相同。但不确定为什么它不起作用。如果我错过了什么,有人能帮我吗?

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话