如何在RX Java中处理嵌套事件

时间:2018-11-19 11:18:37

标签: java spring rx-java reactive-programming

我对RX java还是很陌生,并且遇到了问题。在有事件集的情况下,必须将一个事件的输出作为另一个事件的输入,并且可能有n个事件。我正试图通过以下方式做到这一点。

    public Single<List<EventMetaData>> executeAction(Long blogId){

    Single<BlogPostData> dbblogPostData = manager.findById(blogId);


    Single<BlogPostData> chain = dbblogPostData;
    List<Single<BlogPostData>> allBlogPost = new ArrayList<>();
    allSnapshots.add(dbblogPostData);


    for (EventEntry eventEntry : Events) {
        // create a chain where response of one event is passed to next event


        chain = chain.flatMap(blogPostData -> {
            Single<BlogPostData> newSnapshot = executeEvent(eventEntry, blogPostData);

            return newSnapshot;
        });


        allBlogPost.add(chain);

    }

    return  Single.zip(allBlogPost, objects -> {
                List<blogPostData> snapshotEntries = new ArrayList<>();
                for (Object obj : objects) {
                    snapshotEntries.add((blogPostData) obj);
                }
                return getMetaData(snapshotEntries);
            });
}


 private Single<BlogPostData> executeEvent(Event event, BlogPostData blogpostEntry) throws ManagerException {



    Single<BlogPostData> clientSnapshotSingle =
            facade.getSnpashotFromClient(blogpostEntry, event);


    return clientSnapshotSingle.flatMap(
            blogPost -> {

               // Do some logic here on get new Snapshot,  that needs to be save it to DB


                blogpostEntry = utils.getDBUpdatableData(blogpostEntry, event.getRefId);
                if (event.isDbupdatable) {

                     // This methods returns Single<BlogPostData>
                    return manager.create(blogpostEntry);
                }
                return Single.just(blogpostEntry);
            });

}

现在,如果我有两个事件,那么说e1,e2。这段代码

chain.flatMap(blogPostData -> { Single<BlogPostData> newSnapshot = executeEvent(eventEntry, blogPostData);
      return newSnapshot;}

被执行3次(事件e1两次,事件e2一次)。当我这样订阅时,对于4个事件总共将执行6次。

 Single<List<EventMetaData>> listOfMeta;
     (listOfMeta.subscribe()); 

简化我的例子。调用executeAction时,我从数据库中获取博客条目,然后通过(通过executeEvent()调用)运行一组事件。现在,由于所有事件都是顺序的,因此我需要将第一个事件的输出传递给第二个事件的输入,依此类推。我还将事件的所有输出存储在列表List<Single> allBlogPost中,以对其进行一些计算Single.zip(allBlogPost)

那么有人可以帮助我弄清楚我的代码出了什么问题,以及我如何准确地执行所有事件(如果我应该使用任何其他运算符来执行)n次,并将一个事件的结果传递给另一个事件。

0 个答案:

没有答案