同步调用多个api,spring-boot-webflux



在我的项目中,我们使用spring-boot-webflux,在这种情况下,我必须从特定的微服务中同步调用多个api。例如

for(String api:apiNames){
//call api's
}

根据我的理解,webClient是异步工作的,除非有人订阅它,否则它不会发布响应。

在我当前的场景中,我必须使用webclient,并且只有在成功执行了以前的api之后,我才能调用每个api。

注意:-api响应可以是任何成功/失败的

请帮助我实现此同步呼叫

您可以使用#block()方法使其同步。单声道示例(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#block--)

例如,在(异步(webflux web客户端上:

return webClient.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class)
.block();

上面的例子将等待执行下一行代码,直到它收到响应。之后,您可以以相同的方式再次调用另一个api。

编辑:正如评论中所指出的,我想添加一个警告,即使用#block()是无效的,您应该尝试连锁更多的响应式调用,并尽量避免使您的应用程序成为非响应式调用。

可以在这里找到一篇包含更多详细信息的好帖子:https://stackoverflow.com/a/57365926/1326867

尽管这个问题使用了单词"同步";,相反,描述似乎表明需要顺序性,这意味着一个接一个地执行每个请求。

如果是这样的要求,可以通过Reactor以以下方式实现:

Flux.fromIterable(apiNames)
.concatMap(apiName -> webClient...) // concatMap ensures sequential execution

然而,如果应用程序是一个阻塞的Spring应用程序,那么Nick Hol的答案也是正确的。

最新更新