最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Reactor中的onErrorContinue?和?onErrorResume

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

前言

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

1 基礎(chǔ)功能

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

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 用返回內(nèi)容替換 Flux,因此在 2 之后的數(shù)據(jù)不會(huì)被處理。唯一值得一提的是,onErrorResume() 不必馬上在錯(cuò)誤之后捕獲異常。在 onErrorContinue() 的官網(wǎng)文檔中(onErrorContinue),只有 onErrorContinue() 強(qiáng)調(diào)了了 upstream 關(guān)鍵詞,但顯然,它還有其他含義。

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 會(huì)丟棄錯(cuò)誤數(shù)據(jù) 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

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

5 使用 onErrorResume() 模擬 onErrorContinue()

有些博客建議我們完全不用 onErrorContinue(),且在所有場景中僅用 onErrorResume()。但是上述示例已經(jīng)展示了它們會(huì)產(chǎn)生不同的結(jié)果。那我們怎么實(shí)現(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();
}

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

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

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

有時(shí)候,onErrorContinue() 放在調(diào)用程序中,您無法控制它。但你仍然需要 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() ——這會(huì)阻塞 onErrorContinue(),這樣它就不會(huì)在 onErrorResume() 之前占用錯(cuò)誤。嘗試刪除 onErrorStop(),你會(huì)看到 onErrorContinue() 在 onErrorResume 之前彈出。

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

相關(guān)文章

  • ElasticSearch自定義注解增刪改方式

    ElasticSearch自定義注解增刪改方式

    這篇文章主要介紹了ElasticSearch自定義注解增刪改方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • log4j如何根據(jù)變量動(dòng)態(tài)生成文件名

    log4j如何根據(jù)變量動(dòng)態(tài)生成文件名

    這篇文章主要介紹了log4j如何根據(jù)變量動(dòng)態(tài)生成文件名方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot開啟Bean數(shù)據(jù)校驗(yàn)功能

    springboot開啟Bean數(shù)據(jù)校驗(yàn)功能

    這篇文章主要介紹了springboot開啟Bean數(shù)據(jù)校驗(yàn)功能,通過啟用Bean屬性校驗(yàn)導(dǎo)入JSR303與Hibernate校驗(yàn)框架坐標(biāo),使用@Validated注解啟用校驗(yàn)功能,需要的朋友可以參考下
    2023-10-10
  • Java String的intern方法使用場景示例

    Java String的intern方法使用場景示例

    這篇文章主要介紹了Java String的intern方法使用場景示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 用java WebSocket做一個(gè)聊天室

    用java WebSocket做一個(gè)聊天室

    這篇文章主要為大家詳細(xì)介紹了用java WebSocket做一個(gè)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Spring中@RestControllerAdvice注解的使用詳解

    Spring中@RestControllerAdvice注解的使用詳解

    這篇文章主要介紹了Spring中@RestControllerAdvice注解的使用詳解,@RestControllerAdvice是一個(gè)組合注解,由@ControllerAdvice、@ResponseBody組成,而@ControllerAdvice繼承了@Component,需要的朋友可以參考下
    2024-01-01
  • Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解

    Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解

    這篇文章主要介紹了Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解,文中用代碼舉例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-03-03
  • Java 文創(chuàng)商城系統(tǒng)的實(shí)現(xiàn)流程

    Java 文創(chuàng)商城系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+mysql+maven+tomcat實(shí)現(xiàn)一個(gè)文創(chuàng)商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java中利用gson解析Json實(shí)例教程

    Java中利用gson解析Json實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Java中利用gson解析Json 的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),相信對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Java中的jinfo命令使用詳解

    Java中的jinfo命令使用詳解

    jinfo是JDK提供的一個(gè)可以實(shí)時(shí)查看Java虛擬機(jī)各種配置參數(shù)和系統(tǒng)屬性的命令行工具,本文給大家介紹下Java中的jinfo命令使用,感興趣的朋友一起看看吧
    2022-03-03

最新評論

东乡族自治县| 乐亭县| 德兴市| 玉门市| 明溪县| 饶平县| 华蓥市| 永川市| 姚安县| 上蔡县| 双流县| 仁寿县| 平顶山市| 龙里县| 麻栗坡县| 泌阳县| 浑源县| 会理县| 兰西县| 黄龙县| 治县。| 赤峰市| 富顺县| 太保市| 禹州市| 静乐县| 玉环县| 宁乡县| 恩平市| 梅河口市| 儋州市| 虹口区| 兖州市| 西安市| 乐山市| 景宁| 藁城市| 定襄县| 苗栗县| 蒲江县| 长沙市|