日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-28 09:36:27 230觀看
導讀環境:projectreactor2020.0.141. 前言在響應式編程中,Project Reactor提供了兩個核心的概念:Mono和Flux。Mono和Flux都是Reactor中的Publisher,它們可以產生并發布數據,然后可以被訂閱和消費。這兩個概念在WebFlux中有著廣

環境:projectreactor2020.0.14

3Ql28資訊網——每日最新資訊28at.com

1. 前言

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

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

讓我們開始吧!3Ql28資訊網——每日最新資訊28at.com

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如何轉換元素3Ql28資訊網——每日最新資訊28at.com

FluxFlux3Ql28資訊網——每日最新資訊28at.com

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

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

Mono

Mono表示了0個或1個元素序列,下圖展示了Mono如何轉換元素3Ql28資訊網——每日最新資訊28at.com

圖片圖片3Ql28資訊網——每日最新資訊28at.com

Mono3Ql28資訊網——每日最新資訊28at.com

3Ql28資訊網——每日最新資訊28at.com

Mono<T>是一個專門的發布者<T>,它通過onNext信號發出最多一個項目,然后以onComplete信號終止(Mono成功,有或沒有值),或只發出一個onError信號(Mono失敗)。3Ql28資訊網——每日最新資訊28at.com

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

Mono只提供了可用于` Flux `的操作符子集,有些操作符(特別是那些將Mono與另一個`Publisher`結合的操作符)會切換到`Flux`。例如,Mono#concatWith(Publisher)返回一個Flux,而Mono#then(Mono)返回另一個Mono。3Ql28資訊網——每日最新資訊28at.com

注意,你可以使用Mono來表示只有完成概念的無值異步進程(類似于Runnable)。要創建一個,可以使用一個空的Mono<Void>。3Ql28資訊網——每日最新資訊28at.com

4. Mono & Flux常用操作

Mono常用操作

  • 創建元素

Mono.just(T value)方法:創建一個包含指定值的Mono對象。3Ql28資訊網——每日最新資訊28at.com

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

Mono.empty()方法:創建一個空的Mono對象,即不包含任何元素。3Ql28資訊網——每日最新資訊28at.com

Mono.justOrEmpty(T value)方法:如果指定值不為null,則創建一個包含該值的Mono對象;否則創建一個空的Mono對象。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

Mono.fromCallable(Callable<? extends T> supplier)方法:創建一個Mono對象,該對象包含通過調用給定Callable對象的call()方法得到的返回值。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

Mono.fromSupplier(Supplier<? extends T> supplier)方法:創建一個Mono對象,該對象包含通過調用給定Supplier對象的get()方法得到的返回值。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

Mono.fromFuture(CompletableFuture<? extends Integer> future)方法:創建一個Mono對象,該對象包含通過調用給定CompletableFuture對象3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • 異常處理

下面這個示例完整的展示了當發生異常后的處理3Ql28資訊網——每日最新資訊28at.com

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]
  • 錯誤操作符

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • 錯誤返回操作符

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • 連接操作符

將該Mono的發射與提供的發布者連接(不交錯)。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • then操作符

該操作符是在當前Mono執行完成后切換到另外一個Mono。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

Flux常用操作

  • 創建元素

just():直接使用元素創建Flux,即在創建Flux時拿到數據,之后有誰訂閱它,就重新發送數據給訂閱者。3Ql28資訊網——每日最新資訊28at.com

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

圖片圖片3Ql28資訊網——每日最新資訊28at.com

fromArray()、fromIterable()和fromStream():可以從數組、Iterable對象或Stream對象中創建Flux對象。3Ql28資訊網——每日最新資訊28at.com

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

fromArray

圖片圖片3Ql28資訊網——每日最新資訊28at.com

fromIterable

圖片圖片3Ql28資訊網——每日最新資訊28at.com

fromStream

圖片3Ql28資訊網——每日最新資訊28at.com

empty():創建一個不包含任何元素,只發布結束消息的序列。3Ql28資訊網——每日最新資訊28at.com

圖片圖片3Ql28資訊網——每日最新資訊28at.com

range(int start, int count):創建包含從start起始的count個數量的Integer對象的序列。3Ql28資訊網——每日最新資訊28at.com

Flux.range(1, 10) ;

圖片圖片3Ql28資訊網——每日最新資訊28at.com

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

error操作符

圖片圖片3Ql28資訊網——每日最新資訊28at.com

onErrorResume操作符

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • 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() ;

圖片圖片3Ql28資訊網——每日最新資訊28at.com

  • 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) ;

圖片圖片3Ql28資訊網——每日最新資訊28at.com

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

完畢!!!3Ql28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34654-0.html新一代WebFlux框架核心技術Reactor響應式編程基本用法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: RabbitMQ高級之失敗重試機制(含源碼)

下一篇: 不少人面試都掛在這道題了!你掛了嗎?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 浦城县| 武汉市| 滨州市| 桐庐县| 连平县| 永宁县| 临洮县| 凤城市| 赤峰市| 隆子县| 望江县| 花莲县| 漳州市| 乳源| 遵义市| 卢龙县| 十堰市| 英山县| 南和县| 云霄县| 嫩江县| 濉溪县| 祁东县| 衢州市| 蕲春县| 文成县| 祁门县| 涿鹿县| 正安县| 东安县| 平泉县| 曲水县| 九龙县| 通山县| 杭锦旗| 昌邑市| 商都县| 平度市| 徐水县| 龙南县| 禹城市|