Spring Boot - WebFlux 在 运行 i parallel 时使用 id 保留结果上下文
Spring Boot - WebFlux keep context of result with id when running i parallel
使用 Spring 引导 Web 客户端从 REST API 请求 JSON,来自服务器的响应正文存储在一个简单的 Map
中。对服务器的请求包含一个 ID,但这不包含在响应中,但需要它来解释响应。
我想在并行调用的结果中包含 id,所以而不是 List<Map> data
应该是 Map<UUID,Map> data
或类似的。因此来自服务器的响应与用于获取响应的 ID 配对。
List<Map> data = Flux.fromIterable(ids)
.parallel()
.runOn(Schedulers.elastic())
.flatMap(this::callAPI).sequential().collectList().block();
private Mono<Map> callAPI(UUID id) {
return client.get().uri(uriBuilder -> uriBuilder
.path("/{id}/")
.build(id))
.retrieve().bodyToMono(Map.class);
}
来自@ThomasAndolf 评论
By not returning a Mono<Map>
from your callApi
function. Return a Map
and the Id
in wrapper object that you can later use to remap to your wanted structure .bodyToMono(Map.class).flatMap(map -> { return Mono.just(new Response(id, map)); });
– Thomas Andolf 22 hours ago
使用 Spring 引导 Web 客户端从 REST API 请求 JSON,来自服务器的响应正文存储在一个简单的 Map
中。对服务器的请求包含一个 ID,但这不包含在响应中,但需要它来解释响应。
我想在并行调用的结果中包含 id,所以而不是 List<Map> data
应该是 Map<UUID,Map> data
或类似的。因此来自服务器的响应与用于获取响应的 ID 配对。
List<Map> data = Flux.fromIterable(ids)
.parallel()
.runOn(Schedulers.elastic())
.flatMap(this::callAPI).sequential().collectList().block();
private Mono<Map> callAPI(UUID id) {
return client.get().uri(uriBuilder -> uriBuilder
.path("/{id}/")
.build(id))
.retrieve().bodyToMono(Map.class);
}
来自@ThomasAndolf 评论
By not returning a
Mono<Map>
from yourcallApi
function. Return aMap
and theId
in wrapper object that you can later use to remap to your wanted structure.bodyToMono(Map.class).flatMap(map -> { return Mono.just(new Response(id, map)); });
– Thomas Andolf 22 hours ago