Vollständiges asynchrones WebClient-Beispiel mit Spring WebFluxJava

Java-Forum
Guest
 Vollständiges asynchrones WebClient-Beispiel mit Spring WebFlux

Post by Guest »

Ich bin ein Neuling im reaktiven Programmierparadigma, aber vor kurzem habe ich beschlossen, einen einfachen HTTP-Client auf Spring WebClient zu basieren, da das alte synchronisierte RestTemplate bereits gewartet wird und in kommenden Versionen möglicherweise veraltet sein könnte.
Also habe ich zuerst einen Blick auf die Spring-Dokumentation geworfen und danach das Internet nach Beispielen durchsucht.
Das muss ich sagen (nur für den Moment Sein) Ich Ich habe mich bewusst dafür entschieden, die Reactor-Lib-Dokumentation nicht durchzugehen, daher ist mein Wissen über Monos und Fluxs über das Publisher-Subscriber-Muster hinaus rar. Ich habe mich stattdessen darauf konzentriert, dass etwas funktioniert.
Mein Szenario ist ein einfacher POST, um einen Rückruf an einen Server zu senden, von dem der Client nur am Antwortstatuscode interessiert ist. Es wird keine Leiche zurückgegeben. Also habe ich endlich dieses Code-Snippet gefunden, das funktioniert:

Code: Select all

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);

}
Mein schlechtes Verständnis der Funktionsweise des reaktiven WebClient beginnt mit dem Aufruf zum Abonnieren. Keines der Dutzenden Beispiele, die ich vor dem Codieren meines Clients überprüft habe, enthielt einen solchen Aufruf, aber Tatsache ist, dass der Server, bevor ich diesen Aufruf eingefügt habe, ewig auf die Anfrage gewartet hat.
Dann stieß ich auf das Mantra „Nichts passiert, bis Sie sich anmelden“. Da ich das Muster Plublisher-Subscriber kannte, wusste ich das, aber ich habe (fälschlicherweise) angenommen, dass das Abonnement von der WebClient-API in einer der Exchange- oder bodyToMono-Methoden verwaltet wird ... block() muss auf jeden Fall subskribiert werden, denn wenn Sie es blockieren, Die Anfrage wird sofort ausgegeben.
Meine erste Frage ist also: Ist dieser Aufruf von subscribe() wirklich nötig?
Die zweite Frage ist, warum Verfahren StubHttpClient::handleResponse wird nie zurückgerufen. Die einzige Erklärung dafür, die ich finde, ist, dass die Methode völlig dumm ist, da die zurückgegebene Mono ein Mono ist, da die Antwort außer dem Statuscode nichts enthält und nie instanziiert wird. .. Ich könnte es sogar einfach durch .subscribe() ersetzen. Ist das eine korrekte Annahme?
Abschließend: Ist es zu viel verlangt, ein vollständiges Beispiel für eine Methode zu verlangen, die einen Körper in einem Mono empfängt, der später konsumiert wird? Bei allen Beispielen, die ich finde, geht es nur darum, die Anfrage herauszubekommen, aber wie das Mono oder das Flussmittel später verbraucht wird, entzieht sich meinem Verständnis... Ich weiß, dass ich am Ende besser früher als später das Reactor-Dokument überprüfen muss, aber ich wäre Ihnen dankbar Ein bisschen Hilfe, weil ich Probleme mit der Ausnahmen- und Fehlerbehandlung habe.
Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post