gpt4 book ai didi

java - 使用 WebFlux 对特定映射进行并行 GET 请求

转载 作者:行者123 更新时间:2023-12-02 01:02:45 24 4
gpt4 key购买 nike

我想与WebClient同时调用独立请求。我之前使用 RestTemplate 的方法在等待响应时阻塞我的线程。所以我发现,WebClientParallelFlux可以更有效地使用一个线程,因为它应该用一个线程来调度多个请求。

我的端点请求 id 的元组和一个 location

fooFlux方法将在具有不同参数的循环中被调用数千次。返回的 map 将根据存储的引用值进行断言。

此代码之前的尝试导致重复的 API 调用。但仍然存在一个缺陷。 mapping键集的大小通常小于 Set<String> location 的大小。事实上,生成的 map 的大小正在发生变化。此外,它有时是正确的。因此,在方法返回 map 后,下标完成可能会出现问题。

public Map<String, ServiceDescription> fooFlux(String id, Set<String> locations) {
Map<String, ServiceDescription> mapping = new HashMap<>();
Flux.fromIterable(locations).parallel().runOn(Schedulers.boundedElastic()).flatMap(location -> {
Mono<ServiceDescription> sdMono = getServiceDescription(id, location);
Mono<Mono<ServiceDescription>> sdMonoMono = sdMono.flatMap(item -> {
mapping.put(location, item);
return Mono.just(sdMono);
});
return sdMonoMono;
}).then().block();
LOGGER.debug("Input Location size: {}", locations.size());
LOGGER.debug("Output Location in map: {}", mapping.keySet().size());
return mapping;
}

处理获取请求

private Mono<ServiceDescription> getServiceDescription(String id, String location) {
String uri = URL_BASE.concat(location).concat("/detail?q=").concat(id);
Mono<ServiceDescription> serviceDescription =
webClient.get().uri(uri).retrieve().onStatus(HttpStatus::isError, clientResponse -> {
LOGGER.error("Error while calling endpoint {} with status code {}", uri,
clientResponse.statusCode());
throw new RuntimeException("Error while calling Endpoint");
}).bodyToMono(ServiceDescription.class).retryBackoff(5, Duration.ofSeconds(15));
return serviceDescription;
}

最佳答案

public Map<String, ServiceDescription> fooFlux(String id, Set<String> locations) {
return Flux.fromIterable(locations)
.flatMap(location -> getServiceDescription(id, location).map(sd -> Tuples.of(location, sd)))
.collectMap(Tuple2::getT1, Tuple2::getT2)
.block();
}

注意:flatMap 运算符与 WebClient 调用相结合,可以并发执行,因此无需使用 ParallelFlux 或任何 调度程序

关于java - 使用 WebFlux 对特定映射进行并行 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60462906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com