紀錄一下最近發現的有點意外的 Reactor 反應。
Mono.justOrEmpty(getXXX()) .switchIfEmpty(fallbackXXX()) ...
本來預期的行為是,getXXX() 會回覆一個 Optional 物件,當回覆的 Optional 為 empty 時,才會觸發 fallbackXXX() 去呼叫外部服務。但結果在測試時發現 fallbackXXX() 每次都必然會被執行,雖然最後結果會是對的,如果 getXXX() 有回覆時,走到後面的 stream 內容會是 getXXX() 回覆的東西,但這樣就等於每次執行時都會呼叫外部服務了,而且呼叫後拿到的結果還不一定會用到。
查了好一段時間之後,發現問題好像是出在 Java 本身的 method evaluation 行為上,然後解決方法是必須把 fallbackXXX() 用 Mono.defer() 包裝起來,以達成讓 fallbackXXX() 推遲被執行的目的。
Mono.justOrEmpty(getXXX()) .switchIfEmpty( Mono.defer(fallbackXXX()) ) ...
沒有留言:
張貼留言