繁体   English   中英

如何在阻塞的 Spring MVC 应用程序中进行并发 WebClient 调用?

[英]How to make concurrent WebClient calls in a blocking Spring MVC app?

我正在尝试对 5 个不同的后端系统进行并行 rest api 调用。 每个 rest api 都有不同的端点和不同的响应类型。 我试图通过使用 Webclient 来实现这一点。 我无法弄清楚如何同时“阻止”每个 api 调用发出的 Mono。

这是我的示例代码。

Mono<ClientResponse> userDetails = getUserDetails().subscribeOn(Schedulers.parallel());
Mono<ClientResponse> userAccountDetails = getUserAccountDetails().subscribeOn(Schedulers.parallel());

//getUserDetails and getUserAccountDetails does an exchange() and not retrieve() as i need access to the headers.

Tuple2<ClientResponse, ClientResponse> tuple = Mono.zip(userDetails, userAccountDetails).block();

tuple.getT1().bodyToMono(String.class).block()
tuple.getT2().bodyToMono(String.class).block()

这种方法的问题是即使我压缩了 ClientResponses,我仍然必须为每个项目调用一个块。

您可以简单地将bodyToMono方法调用移动到第一行和第二行:

Mono<String> userDetails = getUserDetails().flatMap(r -> r.bodyToMono(String.class));
Mono<String> userAccountDetails = getUserAccountDetails().flatMap(r -> r.bodyToMono(String.class));

Tuple2<String, String> tuple = Mono.zip(userDetails, userAccountDetails).block();

String userDetailsResponse = tuple.getT1();
String userAccountDetailsResponse = tuple.getT2();

另请注意,我删除了subscribeOn(Schedulers.parallel())运算符。 当您在WebClient使用WebClient ,显式调度不是实现并发所必需的,您可以开箱即用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM