Spring Boot Web 客户端,用于处理重试以及成功和错误响应

Spring boot Web Client to handle retries along with success and error response

提问人:sandeep 提问时间:11/10/2023 更新时间:11/10/2023 访问量:30

问:

我正在尝试创建Spring boot Web客户端来处理成功和错误响应以及重试。我能够在不停用的情况下处理成功/错误响应。下面是我创建的用于动态处理响应的代码。

protected <R,T> Mono<T> Post(final String endpoint, 
                             final MultiValuesMap<String,String) headers,
                             final R requestBody,
                             final Class<? extends T> responseType,
                             final Class<? extends T> errorResponseType) {
       return webclient.post().uri(endpoint).
              headers(httpHeaders.addAll(headers).bodyValue(requestBody).
              exhangeToMono(clientResponse -> {
                  if(clientResponse.statusCode.isError()){
                     return clientResponse.bodyToMono(errorResponseType);
                  }
                   return clientResponse.bodyToMono(responseType);
              });}

如果像下面这样使用将能够处理成功和错误响应,则上述泛型代码将按预期进行预期

BaseResponse response = post("url",headers,requestBoy,SuccessResponse.class,ErrorResponse.class).
 //SuccessResponse,ErrorResponse extends some BaseResponse class

现在我正在尝试在上面添加额外的重试逻辑,如下所示,

protected <R,T> Mono<T> Post(final String endpoint, 
                                 final MultiValuesMap<String,String) headers,
                                 final R requestBody,
                                 final Class<? extends T> responseType,
                                 final Class<? extends T> errorResponseType) {
           return webclient.post().uri(endpoint).
                  headers(httpHeaders.addAll(headers).bodyValue(requestBody).
                  exhangeToMono(clientResponse -> {
                      if(clientResponse.statusCode.isError()){
                         return clientResponse.bodyToMono(errorResponseType);
                      }
                       return clientResponse.bodyToMono(responseType);
                  }).retryWhen(Retry.fixedDelay(3,Duration.ofMillis(100L)).
                     doAfterRetry(retrySignal -> log.info(retrySignal.totalRetries()).
                     filter(this::is5xxError()) 
                    //is5xxError has logic when to trigger

通过上述更改,我无法实现相同的目标,例如返回 BaseResponse 以获取成功和错误场景以及重试无法按预期工作。

可以帮忙。

java spring-boot spring-mvc spring-webclient

评论


答: 暂无答案