Многократный моно и общий подписчик - PullRequest
0 голосов
/ 08 апреля 2020

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

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);
}

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

1 Ответ

3 голосов
/ 08 апреля 2020

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...