[英]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.