Несколько моно и общий подписчик

Я новичок в реактивном программировании на Java. Я планирую использовать spring-webclient вместо restclient, так как последний выводится из эксплуатации. У меня есть ситуация, когда я делаю несколько запросов http post на разные конечные точки, и структура ответа идентична. С кодом веб-клиента, как показано ниже,

List<Mono<CommonResponse>> monolist = new ArrayList<>();
for(String endpoint : endpoints) {
  Mono<CommonResponse> mono = webClient.post()
     .uri(URI.create(endPoint))
     .body(Mono.just(requestData), RequestData.class)
     .retrieve()
     .bodyToMono(CommonResponse.class);
  monolist.add(mono);
}

Я получаю моно по запросу. Так как ответ общий, хотелось бы, чтобы каждый моно подписывался на общий метод, но как различить конечные точки, предполагая, что данные ответа не помогают. Могу ли я передать дополнительные аргументы в метод при подписке?


person Winster    schedule 08.04.2020    source источник


Ответы (1)


Вы можете сделать это следующим образом. Если у вас много моно, вы можете рассматривать команду как поток, что на самом деле означает, что у вас много моно. Затем вы можете подписаться на все из них одним методом. Чтобы передать методу подписки дополнительные аргументы, такие как информация о конечной точке, вы можете создать дополнительный объект с дополнительной информацией.

Flux<ResponseWithEndpoint> commonResponseFlux = Flux.fromIterable(endpoints)
                .flatMap(endpoint -> webClient.post()
                        .uri(URI.create(endpoint))
                        .body(Mono.just(requestData), RequestData.class)
                        .retrieve()
                        .bodyToMono(CommonResponse.class)
                        .map(response -> new ResponseWithEndpoint(response, endpoint)));
...
class ResponseWithEndpoint {
    CommonResponse commonResponse;
    String endpoint;

    public ResponseWithEndpoint(CommonResponse commonResponse, String endpoint) {
        this.commonResponse = commonResponse;
        this.endpoint = endpoint;
    }
}
person Bartosz Kiebdaj    schedule 08.04.2020