【发布时间】:2020-04-27 20:15:46
【问题描述】:
我正在尝试使用WebClient 执行列表请求,然后过滤它们以找到第一个成功的请求(如果有)并返回。或者如果不成功则回退到默认响应。
我面临的问题是,当我在 Flux<ServerResponse> 上调用 .collectList() 时,列表始终为空。根据我之前发出的请求数,我预计该列表将包含 N 个 ServerResponse。
public Mono<ServerResponse> retry(ServerRequest request) {
return Flux.fromIterable(request.headers().header(SEQUENCE_HEADER_NAME))
.map(URI::create)
// Build a "list" of responses
.flatMap(uri -> webClientBuilder.baseUrl(uri.toString()).build()
.method(Objects.requireNonNull(request.method()))
.headers(headers -> request.headers().asHttpHeaders().forEach((key, values) -> {
if (!SEQUENCE_HEADER_NAME.equals(key)) {
headers.addAll(key, values);
}
}))
.body(BodyInserters.fromDataBuffers(request.body(BodyExtractors.toDataBuffers())))
.exchange()
.flatMap(clientResponse -> ServerResponse.status(clientResponse.statusCode())
.headers(headers -> headers.addAll(clientResponse.headers().asHttpHeaders()))
.body(BodyInserters.fromDataBuffers(clientResponse.body(BodyExtractors.toDataBuffers()))))
)
// "Wait" for all of them to complete so we can filter
.collectList()
.flatMap(clientResponses -> {
List<ServerResponse> filteredResponses = clientResponses.stream()
.filter(response -> response.statusCode().is2xxSuccessful())
.collect(Collectors.toList());
if (filteredResponses.isEmpty()) {
log.error("No request succeeded; defaulting to {}", HttpStatus.BAD_REQUEST.toString());
return ServerResponse.badRequest().build();
}
if (filteredResponses.size() > 1) {
log.error("Multiple requests succeeded; defaulting to {}", HttpStatus.BAD_REQUEST.toString());
return ServerResponse.badRequest().build();
}
return Mono.just(filteredResponses.get(0));
});
}
知道为什么.collectList() 总是返回一个空列表吗?
【问题讨论】:
-
Flux.fromIterable(request.headers().header(SEQUENCE_HEADER_NAME))-- 不知道您的问题,但您不应该以这种方式开始您的流程。此外,您不应该使用Flux来触发一系列WebClientMonos。 -
您能否详细说明为什么不以这种方式开始流程?我猜我需要先单独构造
WebClientMonos,然后将它们与.onSuccess()/onError()链接在一起,这就是你的意思吗?
标签: spring-webflux project-reactor reactor