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);
}
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!
Mobile version