как дождаться завершения всех запросов с Spring 5 WebClient? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть простая Java-программа, которая отправляет несколько запросов с помощью Spring WebClient.Каждый возвращает моно, и я использую response.subscribe () для проверки результата.

Однако мой основной поток выполнения завершается до того, как все запросы обработаны, если я не добавлю длинный Thread.sleep ().

С CompletableFutures вы можете использовать: CompletableFuture.allOf (futures) .join ();

Можно ли дождаться завершения всех моно?

1 Ответ

0 голосов
/ 07 июня 2018

Как объяснено в документации Project Reactor , ничего не произойдет, пока вы не наберете subscribe до Publisher.Эта операция возвращает экземпляр Disposable, что означает, что операция может все еще продолжаться в этой точке.

Если вы не находитесь в середине неблокирующего реактивного конвейера (например, HTTP-запрос /обмен ответами или пакетная операция), и вам нужно дождаться завершения этого конвейера, прежде чем выходить из ВМ - тогда вы можете block().На самом деле это один из немногих «разрешенных» вариантов использования для этого.

Ваш вопрос на самом деле не объясняет, что вы подразумеваете под «проверять ответ».Здесь мы просто получим POJO (если статус ответа HTTP не равен 200 или мы не можем десериализовать ответ, будет отправлен сигнал об ошибке).В вашем примере вы можете получить что-то вроде:

Mono<User> one = this.webClient...
Mono<Account> two = this.webClient...
Mono<Book> three = this.webClient...

// we want all requests to happen concurrently
Mono<Void> all = Mono.when(one, two, three);
// we subscribe and then wait for all to be done
all.block();
...