Поэтому сначала я просмотрел документацию 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
Мобильная версия