国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

新一代WebFlux框架核心技術Reactor響應式編程基本用法

開發 前端
Reactor中的Flux和Mono是響應式編程的核心組件,它們提供了豐富的操作符和方法來處理異步數據流。因此,對于使用WebFlux的開發者來說,掌握Reactor的使用是非常重要的。

環境:projectreactor2020.0.14

1. 前言

在響應式編程中,Project Reactor提供了兩個核心的概念:Mono和Flux。Mono和Flux都是Reactor中的Publisher,它們可以產生并發布數據,然后可以被訂閱和消費。這兩個概念在WebFlux中有著廣泛的應用,幫助我們實現異步和非阻塞的編程模型。

在這個主題中,我們將深入探討Mono和Flux的基本使用。我們將了解它們如何被創建,如何訂閱它們的事件,以及如何處理錯誤和完成通知。通過學習這些內容,你將能夠更好地理解WebFlux的響應式編程模型,并能夠在你的項目中有效地使用Mono和Flux。

讓我們開始吧!

2. 環境依賴

<dependency>
  <groupId>io.projectreactor</groupId>
  <artifactId>reactor-core</artifactId>
</dependency>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-bom</artifactId>
      <version>${reactor.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

3. Mono & Flux介紹

Flux

Flux表示了0到N個元素序列,下圖展示了Flux如何轉換元素

FluxFlux

一個Flux<T>是一個標準的Publisher<T>,它表示一個由0到N個發射項目組成的異步序列,可選地由一個完成信號或一個錯誤終止。在響應式流規范中,這三種類型的信號轉換為對下游訂閱者的onNext、onComplete和onError方法的調用。

由于可能信號的范圍很大,Flux是通用的反應式類型。請注意,所有事件,甚至是終止事件,都是可選的:只有onComplete事件才能表示一個空的有限序列,但刪除onComplete事件就會得到一個無限的空序列(沒什么用處,除了關于取消的測試)。類似地,無限序列不一定是空的。例如,Flux.interval(Duration)產生一個無限長的Flux<Long>,并從時鐘發出規則的時標。

Mono

Mono表示了0個或1個元素序列,下圖展示了Mono如何轉換元素

圖片圖片

Mono

Mono<T>是一個專門的發布者<T>,它通過onNext信號發出最多一個項目,然后以onComplete信號終止(Mono成功,有或沒有值),或只發出一個onError信號(Mono失敗)。

大多數Mono實現都希望在調用onNext之后立即對其訂閱者調用onComplete。Mono.never()是一個異常值:它不會發出任何信號,這在技術上并沒有被禁止,但在測試之外并不是特別有用。另一方面,onNext和onError的組合是明確禁止的。

Mono只提供了可用于` Flux `的操作符子集,有些操作符(特別是那些將Mono與另一個`Publisher`結合的操作符)會切換到`Flux`。例如,Mono#concatWith(Publisher)返回一個Flux,而Mono#then(Mono)返回另一個Mono。

注意,你可以使用Mono來表示只有完成概念的無值異步進程(類似于Runnable)。要創建一個,可以使用一個空的Mono<Void>。

4. Mono & Flux常用操作

Mono常用操作

  • 創建元素

Mono.just(T value)方法:創建一個包含指定值的Mono對象。

Mono.just(10).subscribe(System.out::println) ;

Mono.empty()方法:創建一個空的Mono對象,即不包含任何元素。

Mono.justOrEmpty(T value)方法:如果指定值不為null,則創建一個包含該值的Mono對象;否則創建一個空的Mono對象。

// 輸出10
Mono.justOrEmpty(10).subscribe(System.out::println) ;
// 如果值為null,沒有任何輸出
Mono.justOrEmpty(null).subscribe(System.out::println) ;

圖片圖片

Mono.fromCallable(Callable<? extends T> supplier)方法:創建一個Mono對象,該對象包含通過調用給定Callable對象的call()方法得到的返回值。

// 通過Callable方式,我們可以在內部執行其它一些動作
Mono.fromCallable(() -> 666).subscribe(System.out::println) ;

圖片圖片

Mono.fromSupplier(Supplier<? extends T> supplier)方法:創建一個Mono對象,該對象包含通過調用給定Supplier對象的get()方法得到的返回值。

Mono.fromSupplier(() -> 666).subscribe(System.out::println) ;

圖片圖片

Mono.fromFuture(CompletableFuture<? extends Integer> future)方法:創建一個Mono對象,該對象包含通過調用給定CompletableFuture對象

Mono.fromFuture(CompletableFuture.supplyAsync(() -> 666)).subscribe(System.out::println) ;

圖片圖片

  • 異常處理

下面這個示例完整的展示了當發生異常后的處理

public static Mono<Users> invoke(Mono<Users> user) {
  return user.flatMap(u -> {
    if ("admin".equals(u.getName())) {
      return Mono.error(new RuntimeException("越權")) ;
    }
    u.setName(u.getName() + " - ");
    return Mono.just(u) ;
  });
}


public static void main(String[] args) {
  invoke(Mono.just(new Users("admin")))
    .doOnNext(System.out::println)
    .doOnError(e -> {
      System.out.println(e.getMessage()) ;
    })
    // .onErrorResume(e -> Mono.just(new Users(e.getMessage() + " - fallback"))) // 功能更強,可以對捕獲的異常進行響應的處理,然后再返回一個值
    .onErrorReturn(new Users("return")) // 捕獲異常,簡單粗暴直接返回一個靜態值
    .doOnNext(System.out::println)
    .subscribe(); 


}
  • 執行結果
越權
Users [name=return]
  • 錯誤操作符

圖片圖片

  • 錯誤返回操作符

圖片圖片

  • 連接操作符

將該Mono的發射與提供的發布者連接(不交錯)。

Mono.just(10).concatWith(Mono.just(20)).subscribe(System.out::println) ;

圖片圖片

  • then操作符

該操作符是在當前Mono執行完成后切換到另外一個Mono。

Mono.just(10).doOnNext(System.out::println)
  .then(Mono.just(666)) // 切換到另外一個Mono通道, 忽略之前的Mono元素
  .doOnNext(System.out::println)
  .subscribe();

圖片圖片

Flux常用操作

  • 創建元素

just():直接使用元素創建Flux,即在創建Flux時拿到數據,之后有誰訂閱它,就重新發送數據給訂閱者。

Flux.just(1, 2, 3...)

圖片圖片

fromArray()、fromIterable()和fromStream():可以從數組、Iterable對象或Stream對象中創建Flux對象。

Flux.fromArray(new String[]{"1","2","3"});
Flux.fromIterable(List.of("a","b","c"));
Flux.fromStream(List.of("a","b","c").stream());

fromArray

圖片圖片

fromIterable

圖片圖片

fromStream

圖片

empty():創建一個不包含任何元素,只發布結束消息的序列。

圖片圖片

range(int start, int count):創建包含從start起始的count個數量的Integer對象的序列。

Flux.range(1, 10) ;

圖片圖片

  • 錯誤處理
Flux.error(new RuntimeException("錯誤")).onErrorResume(ex -> Mono.just("發生異常:" + ex.getMessage())).subscribe(System.out::println) ;

error操作符

圖片圖片

onErrorResume操作符

圖片圖片

  • when操作符將給定的Publisher<T>聚合成一個新的Mono,當所有給定的來源都完成時,這個Mono就會被滿足。錯誤將導致未執行的結果被取消,并立即向返回的Mono發送錯誤。
Flux.just(1, 3, 6).flatMap(id -> {
  Mono<Integer> query = Mono.fromSupplier(() -> {
    System.out.println("查詢數據...") ;
    return id * 10 ;
  }).delayElement(Duration.ofSeconds(2)) ;
  Mono<String> save = Mono.fromSupplier(() -> {
    System.out.println("保存數據...") ;
    return "success - " + id ;
  }) ;
  return Mono.when(query, save) ;
}).doOnComplete(() -> {
  System.out.println("執行完成...") ;
}).subscribe() ;

圖片圖片

  • filterWhen操作符
Flux.just(1,2,3,4,5,6).concatMap(item -> Mono.just(item).filterWhen(r -> {
  return Mono.just(r % 2 == 0) ;
})).subscribe(System.out::println) ;

圖片圖片

總之,Reactor中的Flux和Mono是響應式編程的核心組件,它們提供了豐富的操作符和方法來處理異步數據流。因此,對于使用WebFlux的開發者來說,掌握Reactor的使用是非常重要的。

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-07-15 11:16:31

Spring WebWebFlux架構

2020-05-06 14:41:47

AIAI安全阿里安全

2013-05-03 09:49:38

ASICSDN可編程ASIC

2015-12-22 19:45:35

2017-10-19 16:21:02

SCM存儲技術

2009-09-02 16:10:40

ADSL技術

2009-06-25 17:14:59

JSF框架

2015-11-26 10:47:11

微軟開源DMTK

2015-06-30 10:00:44

Hyper虛擬化云計算

2023-06-30 07:50:59

響應式設計CSS

2023-04-12 18:36:20

IO框架內核

2022-08-22 08:05:17

Fresh框架Remix

2011-12-07 12:00:06

ibmdw

2024-03-06 11:30:55

PowerScale戴爾科技

2010-01-06 15:50:05

軟交換技術

2021-10-28 14:53:27

鴻蒙HarmonyOS應用

2013-01-04 16:15:08

微軟ERPDynamics AX

2020-06-23 10:22:58

GitHub代碼開發者

2024-09-03 08:14:34

點贊
收藏

51CTO技術棧公眾號

精品一区二区免费在线观看| 日韩午夜激情电影| 中文字幕人成一区| 婷婷精品视频| 中文字幕亚洲专区| 老牛影视精品| 精品成人一区二区三区四区| 69久久精品| 在线免费观看日韩欧美| 宅男午夜在线| 亚洲天天做日日做天天谢日日欢| 亚洲色成人www永久在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 福利视频久久| 欧美黄色精品| 国产v亚洲v天堂无码| 久久中文视频| 91麻豆国产语对白在线观看| 小说区图片区色综合区| 高清视频欧美一级| 黑色丝袜福利片av久久| 性欧美暴力猛交69hd| www.亚洲一二| 久久露脸国产精品| 狼人精品一区二区三区在线| 午夜精品理论片| 高清日韩欧美| 日韩av片免费在线观看| 国产亚洲一区| av日韩免费电影| 宅男噜噜噜66一区二区| 国产美女99p| 亚洲最新中文字幕| 国产激情美女久久久久久吹潮| 日本国产精品| 欧美在线中文字幕| 日韩av网址大全| 日本高清不卡的在线| 欧美热在线视频精品999| 午夜精品在线观看| 伊人久久大香线蕉综合网站 | 亚洲三级电影全部在线观看高清| xxx国产在线观看| 午夜精品久久久久久久99水蜜桃| 黄色av网址在线免费观看| 欧美日韩国产美| 在线成人av观看| 久久99国产综合精品女同| 蜜桃国内精品久久久久软件9| 99久久精品无码一区二区毛片 | 亚洲有码转帖| 欧美日韩精品欧美日韩精品一综合| 免费a级人成a大片在线观看| 日韩精品极品在线观看| 国产精一区二区| 国产精品pans私拍| 亚洲欧美日韩一区在线观看| 日本精品福利视频| 国产精品久久福利| 国产福利小视频在线观看| 日韩精品高清在线| 香蕉久久夜色精品国产使用方法| 超碰97人人在线| 国产精品影音先锋| 精品伦理一区二区| 日韩一区二区视频| 在线综合色站| 久久久99爱| 久久人人爽人人爽| 国产乱理伦片a级在线观看| 亚洲网址你懂得| 久久国产电影| 日本男女交配视频| 福利一区福利二区微拍刺激| 超碰高清在线| 国产精品久久久久久久久久久久 | 国产在线高清视频| 不卡av在线网站| 一区二区国产在线观看| 欧美日韩一区二区在线免费观看 | 可以看av的网站久久看| 亚洲色图38p| 日韩精品一区二区三区四区| 欧美激情影院| 在线精品日韩| 色综合久久综合中文综合网| 不卡亚洲精品| 国模一区二区三区私拍视频| 久久九九久久九九| xxxx另类黑人| 91精品入口蜜桃| 久久影院午夜片一区| 日本不卡三区| 91av在线播放| 国产成人av电影免费在线观看| 国产精品秘入口| 91tv亚洲精品香蕉国产一区7ujn| 精品一区二区三区久久| 男人久久精品| 国产mv久久久| 久久久精品日韩欧美| 俺来俺也去www色在线观看| 91午夜理伦私人影院| 国产精品麻豆视频| 免费在线观看一区| 亚洲人成77777| 欧美色图一区二区三区| 精品一区二区三| 牛夜精品久久久久久久| 亚洲欧美日韩天堂一区二区| 一本久道久久综合狠狠爱| 久草在线新视觉| 668精品在线视频| 久久综合给合久久狠狠狠97色69| 日韩大片免费观看| 亚洲巨乳在线观看| 91精品国产综合久久小美女| 91精品国产视频| 李宗瑞系列合集久久| 欧洲亚洲在线视频| 国产欧美日韩三区| 日本一区二区三区电影免费观看| 黄色三级中文字幕| 亚洲国产精品电影| 免播放器亚洲一区| 国产精品刘玥久久一区| 18成人免费观看网站下载| 亚洲尤物视频在线| 不卡一区综合视频| 日本私人影院在线观看| 国产精品wwww| 亚洲成人动漫精品| 这里只有精品在线| 国产福利第一视频在线播放| 国产91社区| 欧美一区二区免费视频| 日韩成人免费电影| xx欧美视频| 青青在线视频免费| 久久久之久亚州精品露出| 亚洲丝袜自拍清纯另类| 国产综合久久久| 亚洲女人视频| 97久草视频| 制服丝袜激情欧洲亚洲| 日韩高清电影一区| 免费观看成人性生生活片| 精品国产免费av| 日本高清不卡在线| 日韩欧美精品免费在线| 99日韩精品| 在线免费三级电影网站| 欧美亚洲一二三区| 日韩免费av在线| 欧美丝袜丝nylons| 久久国产精品99精品国产| jvid一区二区三区| 国产在线黄色片| 国产精品对白刺激久久久| 欧美成人女星排行榜| 高清久久久久久| 亚洲制服欧美另类| 91高清在线视频| 麻豆一区二区三区在线观看| 欧美激情综合色| 在线精品视频小说1| 精品在线播放免费| 99久久香蕉| 国产在线观看精品一区| 丰满女人性猛交| 91精品国产亚洲| 欧美喷潮久久久xxxxx| 国产高清精品在线| 精品精品国产毛片在线看| 黄色影院在线播放| 黄色影视在线观看| 国产91精品久久久| 91精品欧美久久久久久动漫| 91论坛在线播放| 欧美人成在线| 成人av三级| 色播在线观看| 永久免费看av| 成人精品在线视频| 亚洲天堂第一页| 亚洲成va人在线观看| 美女免费视频一区二区| 欧美1区二区| 大黄网站在线观看| 伊人网在线免费| 成人免费观看网址| 国产午夜精品免费一区二区三区| 亚洲自拍另类综合| 国产一区二区不卡老阿姨| 国产探花一区在线观看| 九色91在线| 最近中文字幕在线| 妺妺窝人体色777777| 51精品国产人成在线观看| 久久亚洲欧美日韩精品专区 |