假设我下面有Flux和Mono嵌套。我有关于两个不同的Apache Cassandra表的信息。我想合并细节并以Flux的形式发送回去。
请参阅下面的更新的伪代码。
@Autowired FollowersRepository followersRepository;
@Autowired TopicRepository topicRepository;
@GetMapping("/info")
public Flux<FullDetails> getData(){
return Flux.create(emitter ->{
followersRepository.findAll()
.doOnNext(data -> {
List<String> all = data.getTopiclist(); //will get list of topic id
List<Alltopics> processedList = new ArrayList<Alltopics>();
all.forEach(action -> {
topicRepository.findById(action) //will get full detail about topic
.doOnSuccess(topic ->{
processedList.add(topic);
if (processedList.size() >= all.size()) {
FullDetails fulldetails = new FullDetails(action,processedList);
emitter.next(fulldetails);
//emitter.complete();
}
})
.subscribe();
});
})
.doOnComplete(() ->{
System.out.println("All the data are processed !!!");
//emitter.complete(); // executing if all the data are pushed from database not waiting for doOnNext method to complete.
})
.subscribe();
});
}
有关更多详细信息,请在此处CodeLink中引用代码。
我尝试使用doOnComplete和doOnFinally处理外部Flux,它没有等待所有内部非阻塞调用完成。
在处理Flux内部所有嵌套的Mono(非阻塞)请求之后,我想调用onComplete。
答案 0 :(得分:1)
发射器内部的通量实际上没有任何作用,因为没有订阅者。发射器通常对引发的事件做出反应,例如收到一条消息等。您可以在下面添加一个subscription()使其起作用。 阅读有关热门和冷订户的信息。 http://projectreactor.io/docs/core/snapshot/reference/#reactor.hotCold
return Flux.create(emitter -> {
Flux.just(1,2,3,4,5) //list of ids from database
.doOnNext(uuid ->{
this.getData(uuid).doOnSuccess((result) -> {
System.out.println("query data from database "+uuid);
emitter.next("Data from database.");
});
})
.doOnComplete(()->{
System.out.println("Not waiting for all the Nested Mono to complete. ");
})
.subscribe();
});
如果您的呼叫是对数据库的,您可能不希望担心通过发射器引发事件 例如
public Flux<String> getAllData2(){
return Flux.just(1, 2, 3, 4, 5)
.flatMap(uuid1 -> getData(uuid1).doOnSuccess(result -> System.out.println("query data from database " + result)))
.doOnComplete(() -> System.out.println("Not waiting for all the Nested Mono to complete. "));
}