首页 > 解决方案 > Spring WebClient,并行调用同一服务,收集成功和错误以进行响应

问题描述

编辑:核心问题是处理来自 Mono 的错误并转换为新的对象类型,以便以后可以根据需要进行映射。现在任何未处理的错误都会停止流。如果我使用 onErrorReturn,那么我必须返回原始响应类型 (UpdateResponse),但我想返回带有错误详细信息的新类型。我可以使用 onErrorResume 并返回 Mono.empty() 但我想再次捕获错误详细信息。

我希望利用 Spring 的 Reactive WebClient 对外部服务进行并行调用,该服务将更新给定 ID 列表的用户,然后将任何错误/成功收集到单个响应中,然后我可以返回给调用者。到目前为止,我看到的所有错误处理都不允许我将数据映射到新的响应,因此不确定如何处理。

// This is the class where I want to collect and map successes/errors to a new response object
public class UpdateUserService {
  private final UpdateUserClient updateUserClient;
  
  public Mono<UpdateUserResponse> updateUser(List<Long> userIds, UpdateUserRequest request) {

    // Parallel calls to updateUserClient
    Mono<UpdateUserResponse> resp = Flux.fromIterable(userIds)
      .flatMap(userId -> updateUserClient.updatUser(userId, request))
      // How to maps successes and handle errors here to UpdateUserResponse?
      ...

      return resp;
      
  }
}

// Supporting classes
public class UpdateUserResponse {
    List<UpdateUserResult> results;
}

public class UpdateUserResult {
    Long id;
    Boolean success;
    String message;
}

public class UpdateUserClient {
    private final WebClient webClient;
    private final String path;


    public Mono<UpdateResponse> updatUser(Long userId, UpdateUserRequest request) {
        return webClient.put()
            .uri(uriBuilder -> uriBuilder
                .path(path)
                .queryParam("userId", userID)
                .build())
            .body(request, UpdateUserRequest.class)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToMono(UpdateResponse.class);  // UpdateResponse just contains a success boolean
    }
}

标签: javaspringspring-webfluxspring-webclient

解决方案


推荐阅读