0

我在命令式 Spring Boot 应用程序中使用 webflux。在这个应用程序中,我需要使用 webclient 对各种后端进行休息调用,并在继续下一步之前等待所有响应。

A类

public ClassA
{
     public Mono<String> restCall1()
     {
          return webclient....exchange()...
                 .retryWhen(Retry.backoff(maxAttempts, Duration.ofSeconds(minBackOff))
                 .filter(this::isTransient)
                 .onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> {
                     return new MyCustomException();
        });
     }
}

B类

public ClassB
{
     public Mono<String> restCall2()
     {
          return webclient....exchange()...
                 .retryWhen(Retry.backoff(maxAttempts, Duration.ofSeconds(minBackOff))
                 .filter(this::isTransient)
                 .onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> {
                     return new MyCustomException();
        });
     }
}
Mono<String> a = classAObj.restCall1();
Mono<String> b = classBObj.restCall2();

ArrayList<Mono<String>> myMonos = new ArrayList<>;

myMonos.add(a);
myMonos.add(b);

try {
List<String> results = Flux.mergeSequential(myMonos).collectList().block();} 
catch(WebclientResponseException e) {
.... 
}

上面的代码按预期工作。Webclient 配置为在 5xx 和 4xx 上抛出错误,我可以使用 WebclientResponseException 捕获这些错误。

问题是我无法从反应框架中捕获任何异常。例如,我的 Web 客户端配置为使用指数退避重试并在耗尽时抛出异常,我无法在上面的 try catch 块中捕获它。我探索了使用 onErrorReturn 在 webclient 流中处理该异常的选项,但它不会将错误传播回我的订阅者。

我也无法将异常添加到 catch 块,因为它永远不会被代码的任何部分抛出。

任何人都可以建议处理这些类型的错误的最佳方法是什么。情景。我是 webflux 和响应式编程的新手。

4

0 回答 0