Vollständiges asynchrones WebClient-Beispiel mit Spring WebFluxJava

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

Post by Anonymous »

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 mir zuerst die Spring-Dokumentation angesehen und danach das Web nach Beispielen durchsucht.
Ich muss sagen, dass ich (vorerst) 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 mir endlich dieses Code-Snippet ausgedacht, 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, wird die Anfrage sofort ausgegeben.
Meine erste Frage lautet also: Wird dieser Aufruf von subscribe() wirklich benötigt?
Die zweite Frage ist, warum die Methode StubHttpClient::handleResponse wird nie zurückgerufen. Die einzige Erklärung dafür, die ich finde, ist, dass die Methode völlig dumm ist, da das zurückgegebene Mono ein Mono ist, da die Antwort außer dem Statuscode nichts enthält, da sie nie instanziiert wird ... Ich könnte sie 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 Mono oder Flux später verbraucht werden, entzieht sich meinem Verständnis... Ich weiß, dass ich das Reactor-Dokument besser früher als später überprüfen muss, aber ich würde mich über etwas Hilfe freuen, da ich Probleme mit der Ausnahmen- und Fehlerbehandlung habe.
Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post