来自 Spring WebFlux Mono 中断的异常 Mono.zip

Exception from a Spring WebFlux Mono interrupts Mono.zip

假设我使用 spring webclient 进行了两次调用。两者都定义如下,在 .onStatus :

中抛出异常
public Mono<Model> getCall(String path) {
    webClient.get()
            .uri(path)
            .retrieve()
            .onStatus(HttpStatus::isError, errorHandler())}

这是异常函数 errorHandler() :

private Function<ClientResponse, Mono<? extends Throwable>> errorHandler() {
    return clientResponse -> clientResponse.bodyToMono(ErrorResponse.class).
            flatMap(errorBody -> Mono.error(new CustomException(clientResponse.statusCode().value(), "exception", errorBody)));

在我的 Mono.zip 上,我定义如下:

Mono.zip(getCall(call1),
         getCall(call2))
         .block;

问题是,如果其中一个调用抛出异常,我至少无法再获得其中一个结果。尝试使用:

.onErrorContinue(CustomException.class, (error, output) -> log.error("CustomException !" + error + output))

那么我如何处理 Mono.zip 的异常,就像我们处理 try catch 一样,但又不停止执行并获取成功调用的结果? 还有谢谢

如果您的输出为空状态,您可以执行以下操作:

.onErrorResume(CustomException.class, e -> Model.empty())

如果你没有空状态,你应该将输出包装成 Optional:

.map(Optional::of)
.onErrorResume(CustomException.class, e -> Optional.empty())

在任何情况下,这些运算符都应链接到 getCall 方法。例如:

public Mono<Model> getCall(String path) {
    return webClient.get()
            .uri(path)
            .retrieve()
            .onStatus(HttpStatus::isError, errorHandler())     
            .retrieve()
            .bodyToMono(Model.class)
            .onErrorResume(CustomException.class, e -> Model.empty());
}