一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java反應式框架Reactor中的Mono和Flux

Java反應式框架Reactor中的Mono和Flux

2021-10-21 10:48碼農小胖哥 Java教程

這篇文章主要介紹了Java反應式框架Reactor中的Mono和Flux,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Java反應式框架Reactor中的Mono和Flux

1. 前言

最近寫關于響應式編程的東西有點多,很多同學反映對fluxmono這兩個reactor中的概念有點懵逼。但是目前java響應式編程中我們對這兩個對象的接觸又最多,諸如spring webflux、rsocket、r2dbc。我開始也對這兩個對象頭疼,所以今天我們就簡單來探討一下它們。

2. 響應流的特點

要搞清楚這兩個概念,必須說一下響應流規范。它是響應式編程的基石。他具有以下特點:

響應流必須是無阻塞的。響應流必須是一個數據流。它必須可以異步執行。并且它也應該能夠處理背壓。

背壓是反應流中的一個重要概念,可以理解為,生產者可以感受到消費者反饋的消費壓力,并根據壓力進行動態調整生產速率。形象點可以按照下面理解:

Java反應式框架Reactor中的Mono和Flux

3. publisher

由于響應流的特點,我們不能再返回一個簡單的pojo對象來表示結果了。必須返回一個類似java中的future的概念,在有結果可用時通知消費者進行消費響應。

reactive stream規范中這種被定義為publisher<t>publisher<t>是一個可以提供0-n個序列元素的提供者,并根據其訂閱者subscriber<? super t>的需求推送元素。一個publisher<t>可以支持多個訂閱者,并可以根據訂閱者的邏輯進行推送序列元素。下面這個excel計算就能說明一些publisher<t>的特點。

Java反應式框架Reactor中的Mono和Flux

a1-a9就可以看做publisher<t>及其提供的元素序列。a10-a13分別是求和函數sum(a1:a9)、平均函數average(a1:a9)、最大值函數max(a1:a9)、最小值函數min(a1:a9),可以看作訂閱者subscriber。假如說我們沒有a10-a13,那么a1-a9就沒有實際意義,它們并不產生計算。這也是響應式的一個重要特點:當沒有訂閱時發布者什么也不做。

fluxmono都是publisher<t>在reactor 3實現。publisher<t>提供了subscribe方法,允許消費者在有結果可用時進行消費。如果沒有消費者publisher<t>不會做任何事情,他根據消費情況進行響應。 publisher<t>可能返回零或者多個,甚至可能是無限的,為了更加清晰表示期待的結果就引入了兩個實現模型monoflux

4. flux

flux 是一個發出(emit)0-n個元素組成的異步序列的publisher<t>,可以被oncomplete信號或者onerror信號所終止。在響應流規范中存在三種給下游消費者調用的方法 onnext, oncomplete, 和onerror。下面這張圖表示了flux的抽象模型:

Java反應式框架Reactor中的Mono和Flux

以上的的講解對于初次接觸反應式編程的依然是難以理解的,所以這里有一個循序漸進的理解過程。

有些類比并不是很妥當,但是對于你循序漸進的理解這些新概念還是有幫助的。

傳統數據處理

我們在平常是這么寫的:

?
1
2
3
4
public list<clientuser> allusers() {
    return arrays.aslist(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

我們通過迭代返回值listget這些元素進行再處理(消費),這種方式有點類似廚師做了很多菜,吃不吃在于食客。需要食客主動去來吃就行了(pull的方式),至于喜歡吃什么不喜歡吃什么自己隨意,怎么吃也自己隨意。

流式數據處理

在java 8中我們可以改寫為流的表示:

?
1
2
3
4
public stream<clientuser> allusers() {
    return  stream.of(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

依然是廚師做了很多菜,但是這種就更加高級了一些,提供了菜品的搭配方式(不包含具體細節),食客可以按照說明根據自己的習慣搭配著去吃,一但開始概不退換,吃完為止,過期不候。

反應式數據處理

在reactor中我們又可以改寫為flux表示:

?
1
2
3
4
public flux<clientuser> allusers(){
    return flux.just(new clientuser("felord.cn", "reactive"),
            new clientuser("felordcn", "reactor"));
}

這時候食客只需要訂餐就行了,做好了自然就呈上來,而且可以隨時根據食客的飯量進行調整。如果沒有食客訂餐那么廚師就什么都不用做。當然不止有這么點特性,不過對于方便我們理解來說這就夠了。

5. mono

mono 是一個發出(emit)0-1個元素的publisher<t>,可以被oncomplete信號或者onerror信號所終止。

Java反應式框架Reactor中的Mono和Flux

這里就不翻譯了,整體和flux差不多,只不過這里只會發出0-1個元素。也就是說不是有就是沒有。象flux一樣,我們來看看mono的演化過程以幫助理解。

傳統數據處理

?
1
2
3
public clientuser currentuser () {
    return isauthenticated ? new clientuser("felord.cn", "reactive") : null;
}

直接返回符合條件的對象或者null

optional的處理方式

?
1
2
3
4
public optional<clientuser> currentuser () {
    return isauthenticated ? optional.of(new clientuser("felord.cn", "reactive"))
            : optional.empty();
}

這個optional我覺得就有反應式的那種味兒了,當然它并不是反應式。當我們不從返回值optional取其中具體的對象時,我們不清楚里面到底有沒有,但是optional是一定客觀存在的,不會出現npe問題。

反應式數據處理

?
1
2
3
4
public mono<clientuser> currentuser () {
    return isauthenticated ? mono.just(new clientuser("felord.cn", "reactive"))
            : mono.empty();
}

optional有點類似的機制,當然mono不是為了解決npe問題的,它是為了處理響應流中單個值(也可能是void)而存在的。

6. 總結

fluxmono是java反應式中的重要概念,但是很多同學包括我在開始都難以理解它們。這其實是規定了兩種流式范式,這種范式讓數據具有一些新的特性,比如基于發布訂閱的事件驅動,異步流、背壓等等。另外數據是推送(push)給消費者的以區別于平時我們的拉(pull)模式。同時我們可以像stream api一樣使用類似mapflatmap等操作符(operator)來操作它們。對fluxmono這兩個概念需要花一些時間去理解它們,不能操之過急。

到此這篇關于java反應式框架reactor中的mono和flux的文章就介紹到這了,更多相關java框架 reactor中的mono和flux內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/felordcn/p/13747262.html

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 精品在线小视频 | 拔插拔插8x8x海外华人免费视频 | 亚洲白拍| 乌克兰一级毛片9一18 | 蜜汁肉桃全文免费阅读 | 热99精品| 男人的影院 | 久久re视频精品538在线 | 熟睡中的麻麻大白屁股小说 | 四虎 2022 永久网站 | 欧美va在线 | 国产免费大片 | 免费视频左左视频 | 色综合天天娱乐综合网 | 国产成人综合亚洲亚洲欧美 | 太大了轻点阿受不了小说h 四色6677最新永久网站 | 国产成人精品999在线 | 亚洲毛片基地4455ww | 4438成人网| 国产精品久久久久无毒 | 日本动漫黄网站在线观看 | 午夜在线播放免费人成无 | 国产第7页 | 韩日视频在线观看 | 99精品国产成人一区二区 | 深夜福利免费在线观看 | 蜜桃视频一区二区三区四区 | 午夜伦理 第1页 | 成人网18免费网 | 色综合久久中文字幕 | 高清一区二区 | 五月一区二区久久综合天堂 | 免费超级乱淫播放手机版 | 天天色影视综合网 | 91在线视频国产 | 亚洲欧美国产在线 | 欧美一区二区三区免费看 | 色综合网亚洲精品久久 | 三体动漫在线观看免费完整版2022 | 国产精品久久久久久久久久久久久久 | 男人肌肌捅女人肌肌 |