亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Reactor中的onErrorContinue?和?onErrorResume

 更新時間:2022年09月22日 15:01:13   作者:十二又十三  
這篇文章主要介紹了Reactor中的onErrorContinue?和?onErrorResume,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下

前言

這似乎是 Reactor 的熱門搜索之一,至少當我在谷歌中輸入 onErrorContinue 時,onErrorResume 會在它旁邊彈出。讓我把我的測試代碼和我的一些解釋粘貼在下面。

1 基礎功能

這是一個簡單的函數(shù),將 5 個連續(xù)的數(shù)字分別乘以 2,然后相加,當 i==2 時拋出一個異常:

public static void main(String... args) {
      Flux.range(1,5)
              .doOnNext(i -> System.out.println("input=" + i))
              .map(i -> i == 2 ? i / 0 : i)
              .map(i -> i * 2)
              .reduce((i,j) -> i+j)
              .doOnNext(i -> System.out.println("sum=" + i))
              .block();
  }

顯然,輸出如下:

input=1
input=2
Exception in thread "main" java.lang.ArithmeticException: / by zero

2 只有 onErrorResume ()

public static void main(String... args) {
      Flux.range(1,5)
              .doOnNext(i -> System.out.println("input=" + i))
              .map(i -> i == 2 ? i / 0 : i)
              .map(i -> i * 2)
              .onErrorResume(err -> {
                  log.info("onErrorResume");
                  return Flux.empty();
              })
              .reduce((i,j) -> i+j)
              .doOnNext(i -> System.out.println("sum=" + i))
              .block();
  }

輸出如下:

input=1
input=2
17:40:47.828 [main] INFO com.example.demo.config.TestRunner - onErrorResume
sum=2

正如官方文檔描述(onErrorResume)的那樣,onErrorResume 用返回內容替換 Flux,因此在 2 之后的數(shù)據不會被處理。唯一值得一提的是,onErrorResume() 不必馬上在錯誤之后捕獲異常。在 onErrorContinue() 的官網文檔中(onErrorContinue),只有 onErrorContinue() 強調了了 upstream 關鍵詞,但顯然,它還有其他含義。

3 只有 onErrorContinue()

public static void main(String... args) {
  Flux.range(1,5)
          .doOnNext(i -> System.out.println("input=" + i))
          .map(i -> i == 2 ? i / 0 : i)
          .map(i -> i * 2)
          .onErrorContinue((err, i) -> {log.info("onErrorContinue={}", i);})
          .reduce((i,j) -> i+j)
          .doOnNext(i -> System.out.println("sum=" + i))
          .block();
}

輸出:

input=1
input=2
17:43:10.656 [main] INFO com.example.demo.config.TestRunner - onErrorContinue=2
input=3
input=4
input=5
sum=26

顯然,onErrorContinue 會丟棄錯誤數(shù)據 2, 然后繼續(xù)數(shù)字 3 直到 5。

4 onErrorResume() 然后 onErrorContinue()

public static void main(String... args) {
    Flux.range(1,5)
            .doOnNext(i -> System.out.println("input=" + i))
            .map(i -> i == 2 ? i / 0 : i)
            .map(i -> i * 2)
            .onErrorResume(err -> {
                log.info("onErrorResume");
                return Flux.empty();
            })
            .onErrorContinue((err, i) -> {log.info("onErrorContinue={}", i);})
            .reduce((i,j) -> i+j)
            .doOnNext(i -> System.out.println("sum=" + i))
            .block();
}

輸出和上面一樣:

input=1
input=2
17:47:05.789 [main] INFO com.example.demo.config.TestRunner - onErrorContinue=2
input=3
input=4
input=5
sum=26

這樣的結果,你想到了嗎?onErrorContinue() 會在 onErrorResume() 得到錯誤之前處理這個錯誤。當兩個錯誤處理函數(shù)在同一個函數(shù)中的時候很明顯,但是當你的函數(shù)中只有 onErrorResume(),而一些調用者實際上有 onErrorContinue() 時,你的 onErrorResume() 沒有被調用的原因可能就不那么明顯了。

5 使用 onErrorResume() 模擬 onErrorContinue()

有些博客建議我們完全不用 onErrorContinue(),且在所有場景中僅用 onErrorResume()。但是上述示例已經展示了它們會產生不同的結果。那我們怎么實現(xiàn)呢?

public static void main(String... args) {
    Flux.range(1,5)
            .doOnNext(i -> System.out.println("input=" + i))
            .flatMap(i -> Mono.just(i)
                    .map(j -> j == 2 ? j / 0 : j)
                    .map(j -> j * 2)
                    .onErrorResume(err -> {
                        System.out.println("onErrorResume");
                        return Mono.empty();
                    })
            )
            .reduce((i,j) -> i+j)
            .doOnNext(i -> System.out.println("sum=" + i))
            .block();
}

因此,本質上是將可能在 flatMap 或 concatMap 中拋出錯誤的操作包裝起來,并在其上使用 onErrorResume()。這樣,它會產生相同的結果:

input=1
input=2
onErrorResume
input=3
input=4
input=5
sum=26

6 使用 onErrorResume() 和下游的 onErrorContinue() 模擬 onErrorContinue()

有時候,onErrorContinue() 放在調用程序中,您無法控制它。但你仍然需要 onErrorResume()。你該怎么辦?

public static void main(String... args) {
    Flux.range(1,5)
            .doOnNext(i -> System.out.println("input=" + i))
            .flatMap(i -> Mono.just(i)
                    .map(j -> j == 2 ? j / 0 : j)
                    .map(j -> j * 2)
                    .onErrorResume(err -> {
                        System.out.println("onErrorResume");
                        return Mono.empty();
                    })
                    .onErrorStop()
            )
            .onErrorContinue((err, i) -> {log.info("onErrorContinue={}", i);})
            .reduce((i,j) -> i+j)
            .doOnNext(i -> System.out.println("sum=" + i))
            .block();
}

秘訣是在 onErrorResume() 代碼塊的末尾添加 onErrorStop() ——這會阻塞 onErrorContinue(),這樣它就不會在 onErrorResume() 之前占用錯誤。嘗試刪除 onErrorStop(),你會看到 onErrorContinue() 在 onErrorResume 之前彈出。

到此這篇關于Reactor中的onErrorContinue 和 onErrorResume的文章就介紹到這了,更多相關Reactor onErrorContinue 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java中Hibernate的基本原理

    詳解Java中Hibernate的基本原理

    持久化是將程序數(shù)據在持久狀態(tài)和瞬時狀態(tài)間轉換的機制。JDBC就是一種持久化機制。文件IO也是一種持久化機制。下面通過本文給大家介紹Java中Hibernate的基本原理,需要的朋友參考下吧
    2017-09-09
  • Jmeter跨線程組共享cookie過程圖解

    Jmeter跨線程組共享cookie過程圖解

    這篇文章主要介紹了Jmeter跨線程組共享cookie過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot Swagger2使用方法過程解析

    Spring Boot Swagger2使用方法過程解析

    這篇文章主要介紹了Spring Boot Swagger2使用方法過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    Spring boot調用Oracle存儲過程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • Java集合系列之LinkedHashMap源碼分析

    Java集合系列之LinkedHashMap源碼分析

    這篇文章主要為大家詳細介紹了Java集合系列之LinkedHashMap源碼分析,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • javaweb如何使用華為云短信通知公共類調用

    javaweb如何使用華為云短信通知公共類調用

    這篇文章主要介紹了javaweb使用華為云短信通知公共類調用的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis-Plus動態(tài)表名的使用

    MyBatis-Plus動態(tài)表名的使用

    本文主要介紹了MyBatis-Plus動態(tài)表名的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • java基于正則表達式實現(xiàn)時間日期的常用判斷操作實例

    java基于正則表達式實現(xiàn)時間日期的常用判斷操作實例

    這篇文章主要介紹了java基于正則表達式實現(xiàn)時間日期的常用判斷操作,簡單說明了正則表達式常用元字符含義并結合實例形式分析了java基于正則表達式針對常用日期時間格式的判斷操作技巧,需要的朋友可以參考下
    2017-10-10
  • 關于Hadoop中Spark?Streaming的基本概念

    關于Hadoop中Spark?Streaming的基本概念

    這篇文章主要介紹了關于Hadoop中Spark?Streaming的基本概念,Spark?Streaming是構建在Spark上的實時計算框架,它擴展了Spark處理大規(guī)模流式數(shù)據的能力,Spark?Streaming可結合批處理和交互式查詢,需要的朋友可以參考下
    2023-07-07
  • Java之next()、nextLine()區(qū)別及問題解決

    Java之next()、nextLine()區(qū)別及問題解決

    這篇文章主要介紹了Java之next()、nextLine()區(qū)別及問題解決,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08

最新評論