Spring Reactive Development - Error Handling

Reactive Developments 对于异常处理, 主要有3个方法, onErrorContinue, onErrorReturn and onErrorResume.

下面我们用代码体验一下他们之间的区别

   private Mono<String> getEmployeeName(String id) {
        Map<String, String> employees = new HashMap<>();
        employees.put("1", "aSha");
        employees.put("2", "billy");
        employees.put("3", "cindy");
        employees.put("4", "davide");
        employees.put("5", "ella");
        employees.put("6", "flee");
        employees.put("7", "galosh");
        employees.put("8", "hank");

        String name = employees.get(id);
        try {
//            Thread.sleep(new Random().nextInt(100)*100);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException("Thread sleep Error!!!");
        }
        if("ella".equals(name)){
            throw new RuntimeException("Not Found!!!");

        }
        if (StringUtils.isBlank(name)) {
            throw new RuntimeException("Not Found!!!");
        }
        return Mono.just(name);
    }

  


@Test public void testFlatMapSequentialParallelScheduler() { List<String> employeeIds = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8"); Flux<String> nameFlux = Flux.fromIterable(employeeIds) .window(2) .flatMapSequential(identities -> identities.flatMap(this::getEmployeeName).subscribeOn(parallel())) .onErrorContinue((e,i)->log.info("error is ",e)) // .onErrorResume(e -> { // log.info("inside error resume!",e); // return Mono.just("Default"); // } // ) // .onErrorReturn("default") .log(); StepVerifier.create(nameFlux) .expectNextCount(8) .verifyComplete(); }

  其中 onErrorResume 和 onErrorReturn 处理异常的结果是一样的, 看源码可以发现onErrorReturn 调用onErrorResume,像这种流式计算通常遇到异常会直接返回, 处理到第5个请求直接打印default就返回了。

     而onErrorContinue 会跳过异常直接向后执行,所以最后会打印7条信息。

 

所以如果是一次单独请求,或者遇到异常需要立即返回的情况使用onErrorResume和onErrorReturn, 而如果是流式计算,希望跳过异常元素的,则应该使用onErrorContinue。

     

posted on 2021-01-09 20:56  涤生-三省吾身  阅读(96)  评论(0编辑  收藏  举报

导航