Полный пример асинхронного WebClient с Spring WebFluxJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Полный пример асинхронного WebClient с Spring WebFlux

Сообщение Anonymous »

Я новичок в парадигме реактивного программирования, но недавно я решил создать простой Http-клиент на основе Spring WebClient, поскольку старая синхронизация RestTemplate уже находится на обслуживании и может быть устаревшей в будущих выпусках.
Поэтому сначала я просмотрел документацию Spring, а затем поискал в Интернете примеры.
Я должен сказать это (только на данный момент) будучи) Я сознательно решил не просматривать документацию по Reactor lib, поэтому, помимо шаблона «Издатель-подписчик», мои знания о Mono и Flux скудны. Вместо этого я сосредоточился на том, чтобы что-то работало.
Мой сценарий представляет собой простой POST для отправки обратного вызова на сервер, от которого клиента интересует только код состояния ответа. Ни одно тело не возвращается. Итак, я наконец придумал этот фрагмент кода, который работает:

Код: Выделить всё

private void notifyJobSuccess(final InternalJobData jobData) {

SuccessResult result = new SuccessResult();
result.setJobId(jobData.getJobId());
result.setStatus(Status.SUCCESS);
result.setInstanceId(jobData.getInstanceId());

log.info("Result to send back:" + System.lineSeparator() + "{}", result.toString());

this.webClient.post()
.uri(jobData.getCallbackUrl())
.body(Mono.just(result), ReplaySuccessResult.class)
.retrieve()
.onStatus(s -> s.equals(HttpStatus.OK), resp -> {
log.info("Expected CCDM response received with HttpStatus = {}", HttpStatus.OK);
return Mono.empty();
})
.onStatus(HttpStatus::is4xxClientError, resp -> {
log.error("CCDM response received with unexpected Client Error HttpStatus {}. "
+ "The POST request sent by EDA2 stub did not match CCDM OpenApi spec", resp.statusCode());
return Mono.empty();
})
.onStatus(HttpStatus::is5xxServerError, resp -> {
log.error("CCDM response received with unexpected Server Error HttpStatus {}", resp.statusCode());
return Mono.empty();
}).bodyToMono(Void.class).subscribe(Eda2StubHttpClient::handleResponseFromCcdm);

}
Мое плохое понимание того, как работает реактивный веб-клиент, начинается с призыва подписаться. Ни один из десятков примеров, которые я проверил перед кодированием своего клиента, не содержал такого вызова, но факт в том, что до того, как я включил этот вызов, Сервер сидел вечно в ожидании запроса.
Тогда я наткнулся на мантру «Ничего не произойдет, пока вы не подпишетесь». Зная шаблон Plublisher-Subscriber, я знал это, но я (ошибочно) предположил, что подписка обрабатывается WebClient API, в любом из методов обмена или bodyToMono... блок() определенно должен подписаться, потому что, когда вы его блокируете, запрос выходит сразу.
Итак, мой первый вопрос: действительно ли нужен этот вызов subscribe()?
Второй вопрос: почему этот метод StubHttpClient::handleResponse никогда не вызывается обратно. Единственное объяснение, которое я нахожу, заключается в том, что, поскольку возвращаемый Mono является Mono, поскольку в ответе нет ничего, кроме кода состояния, поскольку он никогда не создается, метод полностью пустой... Я мог бы даже заменить его просто .subscribe(). Правильно ли это предположение?
Наконец, не слишком ли много просить о полном примере метода, получающего тело в Mono, которое позже используется? Все примеры, которые я нахожу, сосредоточены только на отправке запроса, но то, как Mono или Flux используются позже, теперь за пределами моего понимания... Я знаю, что мне придется проверить документ Reactor раньше, чем позже, но я был бы признателен за небольшую помощь, потому что у меня проблемы с обработкой исключений и ошибок.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/679 ... ng-webflux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»