[英]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 的行為相同。
這種行為的原因是雙重的:
具體關於 blockLast:在內部,它訂閱 flux,並等待完成或錯誤信號返回或向用戶拋出錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.