Spring WebClient toFuture () против block () - в чем главное отличие?

Приложение My Spring Boot использует WebClient для вызовов удаленного API. Мне действительно сложно понять разницу между следующими режимами использования WebClient.

Вариант 1 - использование block ()

// WebClient
public Boolean updateUser(long id) {
    return webClient.post()
            .uri(uriBuilder -> uriBuilder.path(USER_PATH).build(id))
            .body(Mono.just(payload), User.class)
            .exchangeToMono(clientResponse -> Mono.just(clientResponse.statusCode().is2xxSuccessful()))
            .block();
}

// Caller
Boolean result = updateUser(5);

Вариант 2 - с помощью toFuture ():

// WebClient
public CompletableFuture<Boolean> updateUser(long id) {
    return webClient.post()
            .uri(uriBuilder -> uriBuilder.path(USER_PATH).build(id))
            .body(Mono.just(payload), User.class)
            .exchangeToMono(clientResponse -> Mono.just(clientResponse.statusCode().is2xxSuccessful()))
            .toFuture();
}

// Caller
CompletableFuture<Boolean> future = updateUser(5);
Boolean result = future.get();

Насколько я понимаю, использование .block() блокирует поток, когда WebClient делает свой запрос и ждет ответа.

При использовании toFuture() вместо этого WebClient работает в другом потоке, поэтому он не блокируется. Но разве поток все равно не блокируется с помощью метода .get() на CompletableFuture?

Когда я бы предпочел одно другому?

0
0
16
1

Ответы 1

Во втором варианте вы позволяете вызывающему абоненту решать, когда ждать, это выглядит более гибким, чем первый вариант.

Другие вопросы по теме

Как я могу использовать проверенную аннотацию на карте
Внедрение свойств в классы автоматической настройки весенней загрузки в управляемом веб-приложении, отличном от Spring
Подключение к базе данных Azure через прокси-клиент OpenTextSocket в инструменте коннектора БД heidisql работает, но из кода Java он не работает
Невозможно запустить файл jsp при весенней загрузке с использованием встроенного сервера tomcat
Можем ли мы изменить путь .gradle с местоположения пользователей на местоположение проекта в Springboot?
Конвертировать из SQL в запрос JPA
Невозможно отправить сообщение с помощью SSE подключенным клиентам
Docker - Как соединить сервисы вместе с помощью Docker Compose с ZeroMQ
SpringBoot не удалось запустить приложение с ошибкой (не удалось проанализировать класс конфигурации)
Spring Cloud Stream Kafka Streams Binder KafkaException: не удалось запустить поток: 'listener' не может быть нулевым

Похожие вопросы