Как собирать результаты параллельных веб-запросов с помощью Spring WebClient?

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

Звучит просто, используя spring-webflux с WebClient. Но как я могу на самом деле агрегировать результаты?

public List<Response> aggregate(List<Object> bodys) {
    List<Mono> monos = bodys.stream(body -> send(body)).collect(Collectors.toList());

    //TODO how can I get all results in parallel and collect it to a response list?
    List<Response> = Flux.merge(monos)...???...collectList(); //pseudeocode
}

private Mono<Response> send(Object body) {
   return webClient.post().syncBode(body).bodyToMono(type);
}

Что важно: если один из моноов завершается с исключением, то остальные должны выполняться, а не прерываться.


person membersound    schedule 14.08.2019    source источник
comment
Посмотрите здесь: stackoverflow.com/questions/48172582/   -  person Hannes    schedule 14.08.2019
comment
Я не вижу, где это отвечает на мой вопрос в любом случае.   -  person membersound    schedule 14.08.2019


Ответы (1)


Вам нужно применить обработку ошибок на внутренних Monos:

public Mono<List<Response>> aggregate(List<Object> bodies)
{
    return Flux.fromIterable(bodies)
               .flatMap(body -> send(body).onErrorResume(e -> Mono.empty()))
               .collectList();
}

private Mono<Response> send(Object body)
{
    return WEB_CLIENT.post().syncBody(body).retrieve().bodyToMono(Response.class);
}
person Martin Tarjányi    schedule 14.08.2019
comment
Ну, но я хочу вернуть List<Response>, а не Mono! - person membersound; 14.08.2019
comment
Затем вы можете вызвать блок после collectList. - person Martin Tarjányi; 14.08.2019