本文介紹了FlatMap a通量未執行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個包含240個項目的列表,使用for
完全發送此列表需要1個多小時。
List<Map<String, Object>> conventions = mapConventions(objects, referentialService);
for(Map<String, Object> item : conventions) {
webClient.post()
.uri(configProperties.getUrl().getConvention() + CONVENTION)
.bodyValue(objectMapper.convertValue(item, JsonNode.class))
.retrieve()
.bodyToMono(String.class);
}
所以我按照這個article同時發送,以最小化響應時間,但flatmap
中的代碼從未執行過:
Flux.fromIterable(conventions).flatMap(item -> {
System.out.print(item);
return webClient.post()
.uri(configProperties.getUrl().getConvention() + CONVENTION)
.bodyValue(objectMapper.convertValue(item, JsonNode.class))
.retrieve()
.bodyToMono(String.class);
});
推薦答案
在反應式節目中,有生產者和訂閱者。雖然制作人可以輸出結果,但如果沒有人聽取這些結果–這就是訂閱者發揮作用的地方–它不會有任何好處。訂閱者處理生產者的輸出,并對結果做一些有意義的事情。對于反應式編程來說,這是非常重要的,如果訂閱者沒有監聽結果,則生產者將不會執行任何代碼。
因此,在本例中flatmap()
是生產者。并且它不會執行任何代碼,除非有訂閱服務器來處理輸出。
簡短的答案是在平面圖的末尾添加一個subscribe()
調用。看起來像這樣。
Flux.fromIterable(conventions).flatMap(item -> {
System.out.print(item);
return webClient.post()
.uri(configProperties.getUrl().getConvention() + CONVENTION)
.bodyValue(objectMapper.convertValue(item, JsonNode.class))
.retrieve()
.bodyToMono(String.class);
}).subscribe();
已經寫了很多關于這方面的教程。
例如:
https://spring.io/blog/2016/06/13/notes-on-reactive-programming-part-ii-writing-some-code
https://medium.com/@olehdokuka/mastering-own-reactive-streams-implementation-part-1-publisher-e8eaf928a78c
https://projectreactor.io/docs/core/release/reference/
這篇關于FlatMap a通量未執行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,