簡體   English   中英

Reactor 項目:blockLast() 是如何工作的?

[英]Project Reactor: How does blockLast() work?

來自 blockLast() 的文檔:

Subscribe to this Flux and block indefinitely until the upstream signals its last value or completes. Returns that value, or null if the Flux completes empty. In case the Flux errors, the original exception is thrown (wrapped in a RuntimeException if it was a checked exception).

讓我們說一個示例代碼示例:

    Flux
            .range(0, 1000)
            .doOnNext(i -> System.out.println("i = " + i + "Thread: " + Thread.currentThread().getName()))
            .flatMap(i -> {
                System.out.println("end"+ i + " Thread: " + Thread.currentThread().getName());
                return Mono.just(i);
            }).blockLast();

如果我根據文檔自己的描述來理解這一點,我認為blockLast意味着阻止發布者(在這種情況下,直到成功發出所有 1000 個整數,包括最后一個)。

之后 which.flatMap(..) 被調用,一次一個(因為我們沒有特別強制並行處理。

但是我在運行時在控制台中看到以下內容:

i = 0Thread: main
end0 Thread: main
i = 1Thread: main
end1 Thread: main
i = 2Thread: main
end2 Thread: main
i = 3Thread: main
end3 Thread: main
i = 4Thread: main
end4 Thread: main
i = 5Thread: main

是不是i = 0Thread: main應該先運行直到i = 1000Thread: main然后.flatMap被執行?

IE

i = 0Thread: main
i = 1Thread: main
i = 2Thread: main
i = 3Thread: main
i = 4Thread: main
.
.
end1 Thread: main
end2 Thread: main
end3 Thread: main

如果使用.subscribe() ,則行為完全相同。 我在這里有點困惑。

觀察到的行為很好。 Flux 描述了一系列在元素發出時執行的操作。

因此,在您的示例中, range生成的每個 integer 都會立即由鏈中的下一個操作處理,即此處的 flatMap。

它與標准 java.util.stream.Stream API 的行為相同。

這種行為的原因是雙重的:

  • 避免在每個處理步驟之間緩沖所有元素
  • 數據源可以發出無限數量的消息。 並且它還可以以不同的頻率發出消息(有恆定延遲,或不延遲,非常快或非常慢等)。 因此,stream API 旨在處理並在收到每個元素后立即返回它,而與它之前或之后的消息無關。

具體關於 blockLast:在內部,它訂閱 flux,並等待完成或錯誤信號返回或向用戶拋出錯誤。

暫無
暫無

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

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