Java与Project Reactor:为什么Mono block()没有看到错误?
给定以下代码,result.block()等于“xx”,isError()==false,但boom错误处理程序运行,stacktrace显示,承诺未完成。我希望结果是“ko” 我做错了什么?block()Javadoc说 如果onComplete将返回null,如果onNext将返回TJava与Project Reactor:为什么Mono block()没有看到错误?,java,project-reactor,Java,Project Reactor,给定以下代码,result.block()等于“xx”,isError()==false,但boom错误处理程序运行,stacktrace显示,承诺未完成。我希望结果是“ko” 我做错了什么?block()Javadoc说 如果onComplete将返回null,如果onNext将返回T 公共类RApp{ 静态最终记录器日志=LoggerFactory.getLogger(RApp.class); 公共静态void main(字符串[]args){ MonoProcessor texecute=
公共类RApp{
静态最终记录器日志=LoggerFactory.getLogger(RApp.class);
公共静态void main(字符串[]args){
MonoProcessor texecute=MonoProcessor.create();
Mono result=texecute.delaySubscription(持续时间为秒(2))
.onErrorReturn(“ko”)
.doOnNext(s->parse(s)
.doOnSuccess(p->LOG.info(“承诺完成{}”,p))
.doOnTerminate((z,e)->LOG.info(“术语值:{},{},z,e))
.doon错误(t->{
日志错误(“动臂”,t);
})
.subscribe());
texecute.onNext(“xx”);
日志信息(“……”);
String block=result.block();
LOG.info(“r={}”,block);
布尔错误=texecute.isError();
日志信息(错误?“错误”:“无错误”);
depose();
}
公共静态单声道分析(字符串s){
System.out.println(“parse s=“+s”);
如果(s.等于(“xx”)){
返回Mono.error(新异常(“no xx”);
}
返回Mono.just(s);
}
}
回答我自己的问题:do*是一种副作用方法,不会修改per的顺序和返回的顺序
下面是正确的工作解决方案,外加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;
}
LongAdder failureStat=new LongAdder();
MonoProcessor texecute=MonoProcessor.create();
单结果=texecute
.延迟订阅(持续时间为秒(2))
.map(e->parse2(e)).doon错误(e->{
failureStat.increment();
}).doOnSuccess(s->{
LOG.info(“success{}”,s);
})
.onErrorReturn(“ko”)
.subscribe();
texecute.onNext(“xx”);
日志信息(“……”);
String block=result.block();
LOG.info(“r={}”,block);
System.out.println(“failureStat=“+failureStat”);
depose();
公共静态字符串解析2(字符串s){
System.out.println(“parse s=“+s”);
如果(s.等于(“xx”)){
试一试{
抛出新异常(“no xx”);
}捕获(例外e){
抛出异常。传播(e);
}
}
返回s;
}
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;
}