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