Gegeben der folgende Code, result.block() ist gleich "xx", isError() == false, aber der Boom-Error-Handler läuft, der Stacktrace wird angezeigt, das Versprechen ist nicht abgeschlossen. Ich würde erwarten, dass das Ergebnis "ko" ist.Java mit Project Reactor: Warum sieht der Mono-Block() den Fehler nicht?
Was mache ich falsch? Block() Javadoc sagt
null zurück, wenn onComplete, T wenn OnNext
public class RApp {
static final Logger LOG = LoggerFactory.getLogger(RApp.class);
public static void main(String[] args) {
MonoProcessor<String> texecute = MonoProcessor.create();
Mono<String> result = texecute.delaySubscription(Duration.ofSeconds(2))
.onErrorReturn("ko")
.doOnNext(s -> parse(s)
.doOnSuccess(p -> LOG.info("promise completed {}", p))
.doOnTerminate((z, e) -> LOG.info("term value: {} , {}", z, e))
.doOnError(t -> {
LOG.error("boom", t);
})
.subscribe());
texecute.onNext("xx");
LOG.info("...............;");
String block = result.block();
LOG.info("r={}", block);
boolean error = texecute.isError();
LOG.info(error ? "error" : "no error");
texecute.dispose();
}
public static Mono<String> parse(String s) {
System.out.println("parse s = " + s);
if (s.equals("xx")) {
return Mono.error(new Exception("no xx"));
}
return Mono.just(s);
}
}