本文介紹了FlatMap a通量未執(zhí)行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我有一個包含240個項目的列表,使用for
完全發(fā)送此列表需要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同時發(fā)送,以最小化響應(yīng)時間,但flatmap
中的代碼從未執(zhí)行過:
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);
});
推薦答案
在反應(yīng)式節(jié)目中,有生產(chǎn)者和訂閱者。雖然制作人可以輸出結(jié)果,但如果沒有人聽取這些結(jié)果–這就是訂閱者發(fā)揮作用的地方–它不會有任何好處。訂閱者處理生產(chǎn)者的輸出,并對結(jié)果做一些有意義的事情。對于反應(yīng)式編程來說,這是非常重要的,如果訂閱者沒有監(jiān)聽結(jié)果,則生產(chǎn)者將不會執(zhí)行任何代碼。
因此,在本例中flatmap()
是生產(chǎn)者。并且它不會執(zhí)行任何代碼,除非有訂閱服務(wù)器來處理輸出。
簡短的答案是在平面圖的末尾添加一個subscribe()
調(diào)用。看起來像這樣。
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();
已經(jīng)寫了很多關(guān)于這方面的教程。
例如:
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/
這篇關(guān)于FlatMap a通量未執(zhí)行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,