给定以下代码,result.block()等于" xx",isError()== false,然后运行繁荣错误处理程序,显示堆栈跟踪,未完成承诺。我希望结果是" ko"。
我做错了什么? block()Javadoc说
如果onComplete,将返回null,如果onNext
,则返回T.
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);
}
}
答案 0 :(得分:1)
回答这个问题:do *是副作用方法,不修改每https://projectreactor.io/docs/core/release/reference/#error.handling的序列,onErrorReturn 的顺序很重要。
下面的正确工作解决方案,带有reactor.core.Exceptions.propagate的奖励以包装已检查的异常和java 8失败计数器:
LongAdder failureStat = new LongAdder();
MonoProcessor<String> texecute = MonoProcessor.create();
Mono<String> result = texecute
.delaySubscription(Duration.ofSeconds(2))
.map(e -> parse2(e)).doOnError(e -> {
failureStat.increment();
}).doOnSuccess(s -> {
LOG.info("success {}", s);
})
.onErrorReturn("ko")
.subscribe();
texecute.onNext("xx");
LOG.info("...............;");
String block = result.block();
LOG.info("r={}", block);
System.out.println("failureStat = " + failureStat);
texecute.dispose();
public static String parse2(String s) {
System.out.println("parse s = " + s);
if (s.equals("xx")) {
try {
throw new Exception("no xx");
} catch (Exception e) {
throw Exceptions.propagate(e);
}
}
return s;
}