如何处理具有嵌套Mono(非阻塞)的Flux中的所有数据?

时间:2018-08-02 10:13:35

标签: reactive-programming spring-webflux project-reactor

假设我下面有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。

1 个答案:

答案 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. "));
    }