Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java与Project Reactor:为什么Mono block()没有看到错误?_Java_Project Reactor - Fatal编程技术网

Java与Project Reactor:为什么Mono block()没有看到错误?

Java与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=

给定以下代码,result.block()等于“xx”,isError()==false,但boom错误处理程序运行,stacktrace显示,承诺未完成。我希望结果是“ko”

我做错了什么?block()Javadoc说

如果onComplete将返回null,如果onNext将返回T

公共类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;
}