电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:6日期:2022-08-08 17:37:52

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

1. 前言

最近寫關于響應式編程的東西有點多,很多同學反映對Flux和Mono這兩個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就沒有實際意義,它們并不產生計算。這也是響應式的一個重要特點:當沒有訂閱時發布者什么也不做。

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

4. Flux

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

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

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

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

傳統數據處理

我們在平常是這么寫的:

public List<ClientUser> allUsers() { return Arrays.asList(new ClientUser('felord.cn', 'reactive'), new ClientUser('Felordcn', 'Reactor'));}

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

流式數據處理

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

public Stream<ClientUser> allUsers() { return Stream.of(new ClientUser('felord.cn', 'reactive'), new ClientUser('Felordcn', 'Reactor'));}

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

反應式數據處理

在Reactor中我們又可以改寫為Flux表示:

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的演化過程以幫助理解。

傳統數據處理

public ClientUser currentUser () { return isAuthenticated ? new ClientUser('felord.cn', 'reactive') : null;}

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

Optional的處理方式

public Optional<ClientUser> currentUser () { return isAuthenticated ? Optional.of(new ClientUser('felord.cn', 'reactive')) : Optional.empty();}

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

反應式數據處理

public Mono<ClientUser> currentUser () { return isAuthenticated ? Mono.just(new ClientUser('felord.cn', 'reactive')) : Mono.empty();}

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

6. 總結

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

到此這篇關于Java反應式框架Reactor中的Mono和Flux的文章就介紹到這了,更多相關Java框架 Reactor中的Mono和Flux內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 青岛成人高考_山东成考报名网 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 一氧化氮泄露报警器,二甲苯浓度超标报警器-郑州汇瑞埔电子技术有限公司 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 贵州自考_贵州自学考试网| 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 杭州双螺杆挤出机-百科 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 浙江上沪阀门有限公司| 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 |