Приложение 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?
Когда я бы предпочел одно другому?
Во втором варианте вы позволяете вызывающему абоненту решать, когда ждать, это выглядит более гибким, чем первый вариант.