Spring Reactor Operators

just 與 defer 的差異

Bruce Hsu
Nov 15, 2020

Spring Reactor 用一陣子之後會發現當我們在創建Reactor Flow的時候有Mono與Flux兩種物件開始,我們最常在生成Flow時會直接call method。

其實在收集資料時我們很常使用的just,是一種貪婪取值的operator。
有一種更懶惰的取值operator叫做defer。

今天來介紹just與defer的使用時機與差異

Just就是一個貪婪的觀察者操作

我們來看一下正常會出現在程式內的 just operator 範例..

在Mono上我們傳入id,並產生一個publisher對傳入的id查詢db並且轉成bo object,做對外api的發送。

在Flux範例也是做差不多的事情,差別在Flux flow是整個查詢並逐一處理。

在這個範例中我們稱為貪婪式的取值的原因是,
如果我們沒有下subscribe,他依然會先創建just內所需要觀察的物件。
這個時候其實不會是非同步的,一定得just內部創建完才會傳出。

有時候我們不會馬上在method中下subscribe,而是交由外部呼叫的使用者訂閱,但這時候Flow創建時已經貪婪處理了,可能會造成資料的即時性。

Defer就是來惰性取值的幫手

以下我們直接看 defer operator 範例

這個範例只是將just改成defer,我們將Mono與Flux的訂閱時間交由外部呼叫的使用者來決定。

魔力在於這個範例的getDataFromRepository與getAllDatas都是使用者訂閱時才開始惰性處理,這樣才可以拿到當下使用者訂閱時更即時的資料

--

--

Bruce Hsu

I'm a Java engineer, eager to learn new skills, technique and willing to take challenges.