2017-08-04 47 views
0

給定以下代碼,result.block()等於「xx」,isError()== false,但繁榮錯誤處理程序運行,堆棧跟蹤顯示,承諾未完成。我希望結果是「ko」。帶有Project Reactor的Java:爲什麼Mono block()沒有看到錯誤?

我在做什麼錯?塊()的Javadoc說

將返回null的onComplete,T如果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); 
} 
} 

回答

0

回答自己在這一個:該做*的副作用的方法不是每個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; 
} 
相關問題