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