本篇內(nèi)容介紹了“如何理解響應(yīng)式編程中Mono和Flux”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
靖遠(yuǎn)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),靖遠(yuǎn)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為靖遠(yuǎn)上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的靖遠(yuǎn)做網(wǎng)站的公司定做!
1. 前言
很多同學(xué)反映對(duì)響應(yīng)式編程中的Flux和Mono這兩個(gè)Reactor中的概念有點(diǎn)懵逼。但是目前Java響應(yīng)式編程中我們對(duì)這兩個(gè)對(duì)象的接觸又最多,諸如Spring WebFlux、RSocket、R2DBC。
2. 響應(yīng)流的特點(diǎn)
要搞清楚這兩個(gè)概念,必須說(shuō)一下響應(yīng)流規(guī)范。它是響應(yīng)式編程的基石。他具有以下特點(diǎn):
響應(yīng)流必須是無(wú)阻塞的。
響應(yīng)流必須是一個(gè)數(shù)據(jù)流。
它必須可以異步執(zhí)行。
并且它也應(yīng)該能夠處理背壓。
背壓是反應(yīng)流中的一個(gè)重要概念,可以理解為,生產(chǎn)者可以感受到消費(fèi)者反饋的消費(fèi)壓力,并根據(jù)壓力進(jìn)行動(dòng)態(tài)調(diào)整生產(chǎn)速率。形象點(diǎn)可以按照下面理解:
有沒有背壓的兩種情形
3. Publisher
由于響應(yīng)流的特點(diǎn),我們不能再返回一個(gè)簡(jiǎn)單的POJO對(duì)象來(lái)表示結(jié)果了。必須返回一個(gè)類似Java中的Future的概念,在有結(jié)果可用時(shí)通知消費(fèi)者進(jìn)行消費(fèi)響應(yīng)。
Reactive Stream規(guī)范中這種被定義為Publisher
A1-A9就可以看做Publisher
而Flux和Mono都是Publisher
4. Flux
Flux是一個(gè)發(fā)出(emit)0-N個(gè)元素組成的異步序列的Publisher
Flux
以上的的講解對(duì)于初次接觸反應(yīng)式編程的依然是難以理解的,所以這里有一個(gè)循序漸進(jìn)的理解過(guò)程。
有些類比并不是很妥當(dāng),但是對(duì)于你循序漸進(jìn)的理解這些新概念還是有幫助的。
傳統(tǒng)數(shù)據(jù)處理
我們?cè)谄匠J沁@么寫的:
public ListallUsers() { return Arrays.asList(new ClientUser("felord.cn", "reactive"), new ClientUser("Felordcn", "Reactor")); }
我們通過(guò)迭代返回值List來(lái)get這些元素進(jìn)行再處理(消費(fèi)),這種方式有點(diǎn)類似廚師做了很多菜,吃不吃在于食客。需要食客主動(dòng)去來(lái)吃就行了(pull的方式),至于喜歡吃什么不喜歡吃什么自己隨意,怎么吃也自己隨意。
流式數(shù)據(jù)處理
在Java 8中我們可以改寫為流的表示:
public StreamallUsers() { return Stream.of(new ClientUser("felord.cn", "reactive"), new ClientUser("Felordcn", "Reactor")); }
依然是廚師做了很多菜,但是這種就更加高級(jí)了一些,提供了菜品的搭配方式(不包含具體細(xì)節(jié)),食客可以按照說(shuō)明根據(jù)自己的習(xí)慣搭配著去吃,一但開始概不退換,吃完為止,過(guò)期不候。
反應(yīng)式數(shù)據(jù)處理
在Reactor中我們又可以改寫為Flux表示:
public FluxallUsers(){ return Flux.just(new ClientUser("felord.cn", "reactive"), new ClientUser("Felordcn", "Reactor")); }
這時(shí)候食客只需要訂餐就行了,做好了自然就呈上來(lái),而且可以隨時(shí)根據(jù)食客的飯量進(jìn)行調(diào)整。如果沒有食客訂餐那么廚師就什么都不用做。當(dāng)然不止有這么點(diǎn)特性,不過(guò)對(duì)于方便我們理解來(lái)說(shuō)這就夠了。
5. Mono
Mono 是一個(gè)發(fā)出(emit)0-1個(gè)元素的Publisher
Mono
這里就不翻譯了,整體和Flux差不多,只不過(guò)這里只會(huì)發(fā)出 0-1 個(gè)元素。也就是說(shuō)不是有就是沒有。象Flux一樣,我們來(lái)看看Mono的演化過(guò)程以幫助理解。
傳統(tǒng)數(shù)據(jù)處理
public ClientUser currentUser () { return isAuthenticated ? new ClientUser("felord.cn", "reactive") : null; }
直接返回符合條件的對(duì)象或者null。
Optional 的處理方式
public OptionalcurrentUser () { return isAuthenticated ? Optional.of(new ClientUser("felord.cn", "reactive")) : Optional.empty(); }
這個(gè)Optional我覺得就有反應(yīng)式的那種味兒了,當(dāng)然它并不是反應(yīng)式。當(dāng)我們不從返回值Optional取其中具體的對(duì)象時(shí),我們不清楚里面到底有沒有,但是Optional是一定客觀存在的,不會(huì)出現(xiàn)NPE問(wèn)題。
反應(yīng)式數(shù)據(jù)處理
public MonocurrentUser () { return isAuthenticated ? Mono.just(new ClientUser("felord.cn", "reactive")) : Mono.empty(); }
和Optional有點(diǎn)類似的機(jī)制,當(dāng)然Mono不是為了解決NPE問(wèn)題的,它是為了處理響應(yīng)流中單個(gè)值(也可能是Void)而存在的。
“如何理解響應(yīng)式編程中Mono和Flux”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!