簡體   English   中英

在 Flux Flatmap 中處理 Mono

[英]Handling Mono Inside Flux Flatmap

我有一個字符串通量。 對於每個字符串,我必須進行遠程調用。 但問題是,進行遠程調用的方法實際上返回了一個 Mono 響應(顯然因為對應於單個請求,所以會有單個響應)。

處理這種情況的正確模式應該是什么? 我能想到的一種解決方案是對流元素進行串行(或並行)調用,並將響應減少為單個響應並返回。

這是代碼:

fluxObj.flatmap(a -> makeRemoteCall(a)//converts the Mono of the response to a Flux).reduce(...)

我無法將頭環繞在flatmapmakeRemoteCall方法返回Mono 但是flatmap返回響應的Flux 首先,為什么會發生這種情況? 其次,這是否意味着返回的Flux包含單個響應對象(在Mono中返回)?

如果mapper Function返回Mono ,則意味着Flux中的每個源元素將(最多)有一個派生值。

Function返回:

  • 給定值的空 Mono(例如Mono.empty() )意味着該源值被“忽略”
  • 有價值的Mono (如您的示例中)意味着此源值異步映射到另一個特定值
  • 給定值具有多個派生值的Flux意味着此源值異步映射到多個值

例如,給定以下flatMap

Flux.just("A", "B")
    .flatMap(v -> Mono.just("value" + v))

訂閱上述Flux<String>並打印發出的元素將產生:

valueA
valueB

另一個有趣的例子:由於延遲,人們可能會得到無序的結果。 像這樣:

Flux.just(300, 100)
    .flatMap(delay -> Mono.delay(Duration.ofMillis(delay))
                          .thenReturn(delay + "ms")
    )

將導致Flux<String>產生:

100ms
300ms

如果您看到文檔flatMap ,則可以找到問題的答案:

將此 Flux 發出的元素異步轉換為發布者,然后將這些內部發布者扁平化為單個 Flux,使用串聯順序並保留順序。

長話短說,

@Test
public void testFlux() {
    Flux<String> oneString = Flux.just("1");

    oneString
        .flatMap(s -> testMono(s))
        .collectList()
        .subscribe(integers -> System.out.println("elements:" + integers));       

}

private Mono<Integer> testMono(String s) {
    return Mono.just(Integer.valueOf(s + "0"));
}

mapper - s -> testMono(s)其中testMono(s)是 Publisher (在您的情況下makeRemoteCall(a) ),它將我的oneString類型oneStringInteger

我將 Flux 結果收集到 List,並打印出來。 控制台輸出:

elements:[10]

這意味着flatMap運算符之后的 result Flux 僅包含一個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM