当前位置: 首页 > 知识库问答 >
问题:

如何按顺序执行Vertx Future

麹学文
2023-03-14

在我的示例项目中,我尝试在应用程序启动时做一些初始化工作。

  • Java 16
  • Vertx 4.1.0

检查完整的项目代码。

log.info("Data initialization is starting...");
        var deleteComments = this.comments.deleteAll().onSuccess(event -> log.info("deleted comments: {}", event));
        var deletePosts = this.posts.deleteAll().onSuccess(event -> log.info("deleted posts: {}", event));
        var deleteUsers = this.authors.deleteAll().onSuccess(event -> log.info("deleted users: {}", event));

        //log.info("deleted rows: authors: {}, comments: {}, posts: {}", authorsDel, commentsDel, postDel);
        var insertData = this.authors.create("user", "user@example.com").onSuccess(
            authorId -> {
                IntStream.range(1, 5)
                    .forEach(
                        i -> {
                            this.posts.create("Dgs post #" + i, "test content of #" + i, PostStatus.DRAFT.name(), authorId).onSuccess(
                                postId -> {

                                    IntStream.range(1, new Random().nextInt(5) + 1)
                                        .forEach(c -> this.comments.create("comment #" + c, postId));
                                }
                            );

                        }
                    );
            }
        );

        var printPosts = this.posts.findAll().onSuccess(p -> log.info("post: {}", p));
        var printComments = this.comments.findAll().onSuccess(p -> log.info("comment: {}", p));
        var printAuthors = this.authors.findAll().onSuccess(p -> log.info("author: {}", p));

        deleteComments
            .flatMap(integer -> deletePosts)
            .flatMap(integer -> deleteUsers)
            .flatMap(integer -> insertData)
            .flatMap( uuid -> printPosts)
            .flatMap(postEntities -> printComments)
            .flatMap(commentEntities -> printAuthors)
            .onSuccess(event -> log.info("done"));
        log.info("done data initialization...");

但它并没有像预期的那样工作。

  1. 没有像Reactor那样的方法

我找不到一种有效的方法来按顺序执行它们。

更新时间:

我按照建议更改了代码。

  this.comments.deleteAll().onSuccess(event -> log.info("deleted comments: {}", event))
            .flatMap(r -> this.posts.deleteAll().onSuccess(event -> log.info("deleted posts: {}", event)))
            .flatMap(r -> this.authors.deleteAll().onSuccess(event -> log.info("deleted users: {}", event)))
            .flatMap(r -> this.authors.create("user", "user@example.com")
                .onSuccess(
                    authorId -> {
                        log.info("inserted user: {}", authorId);
                        IntStream.range(1, 5)
                            .forEach(
                                i -> {
                                    this.posts.create("Dgs post #" + i, "test content of #" + i, PostStatus.DRAFT.name(), authorId).onSuccess(
                                        postId -> {
                                            log.info("inserted post: {}", postId);
                                            IntStream.range(1, new Random().nextInt(5) + 1)
                                                .forEach(c -> this.comments.create("comment #" + c, postId)
                                                    .onSuccess(id -> log.info("inserted comment: {}", id))
                                                );
                                        }
                                    );

                                }
                            );
                    }
                )
            )
            .flatMap(r -> this.posts.findAll().onSuccess(p -> log.info("saved posts: {}", p)))
            .flatMap(r -> this.comments.findAll().onSuccess(p -> log.info("saved comments: {}", p)))
            .flatMap(r -> this.authors.findAll().onSuccess(p -> log.info("saved authors: {}", p)))
            .onSuccess(event -> log.info("done data initialization..."));

并在控制台中获取以下日志。

10:20:46.699 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - Data initialization is starting...
10:20:47.768 [vert.x-eventloop-thread-1] INFO  com.example.demo.MainVerticle - HTTP server started on port 8080
10:20:47.768 [vert.x-eventloop-thread-0] INFO  i.v.c.i.l.c.VertxIsolatedDeployer - Succeeded in deploying verticle
10:20:47.918 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - deleted comments: 10
10:20:47.942 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - deleted posts: 4
10:20:47.960 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - deleted users: 1
10:20:48.022 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted user: 260fee93-cf60-408d-a3e9-f7b08ed7545a
10:20:48.047 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - saved posts: []
10:20:48.052 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted post: 57a936e2-9611-43b5-94e2-1b01069cd327
10:20:48.056 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - saved comments: []
10:20:48.067 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - saved authors: [AuthorEntity[id=260fee93-cf60-408d-a3e9-f7b08ed7545a, name=user, email=user@example.co
m, createdAt=null]]
10:20:48.092 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - done data initialization...
10:20:48.112 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted post: 534b99ae-4847-4cea-84c1-88cea87f20b7
10:20:48.117 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted post: f7dca2eb-0954-4368-b9b6-68a00f6748f2
10:20:48.120 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted post: 02e8f84f-25dd-4d69-b7f1-8c125ce35bc1
10:20:48.131 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted comment: b9bf618a-f579-48f5-96cc-51f962ca041c
10:20:48.134 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted comment: 052cfde8-627d-4cb3-8812-5543673a20ea
10:20:48.143 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted comment: 69a5dc2b-30f8-4008-90a1-e8c724336dcd
10:20:48.149 [vert.x-eventloop-thread-1] INFO  com.example.demo.DataInitializer - inserted comment: a19c2626-1546-4ba0-a663-823df08d836f

如何在输入打印结果之前确保插入块中的所有未来都已完成。

共有1个答案

周宏胜
2023-03-14

这很可能是因为您的deleteAll和findAll操作并不懒惰。正因为如此,你一打电话,他们就开始跑步。而不是执行以下操作:

deleteComments
  .flatMap(integer -> deletePosts)
  ...

你想这样做:

deleteComments
  .flatMap(integer -> this.posts.deleteAll())
  ...

这将确保它们将按顺序运行。如果您想要更类似于Reactor的东西,您可以查看Vert. x的RxJava3扩展或叛变绑定。

 类似资料:
  • 问题内容: 我有一系列的诺言,需要按顺序运行。 调用RSVP.all将并行执行它们: 但是,如何依次运行它们? 我可以像这样手动堆叠它们 但是问题在于承诺的数量各不相同,并且承诺的数组是动态构建的。 问题答案: 如果您已经将它们放在数组中,那么它们已经在执行。如果您有一个承诺,那么它已经在执行。这与promise无关(即,在方法方面,它们不像C#一样)。什么都不执行,只会返回一个承诺。 如果您有一

  • 我有以下触发器配置: 我的工作可能超过5秒。 可行吗? 谢谢

  • 问题内容: 如果我有这样的数据: 我如何将命令连接成这样: 我在下面使用了此查询,但命令列的顺序不依其顺序号而定: 任何意见和建议将不胜感激。^ _ ^ 问题答案: 永远不要使用。阅读为什么不在Oracle中使用WM_CONCAT函数? 请参阅本主题https://stackoverflow.com/a/28758117/3989608。 它没有记录,并且依赖的任何应用程序一旦升级到后都将无法工作

  • 问题内容: 这个问题与执行顺序无关。这只是关于ORDER BY。 在标准执行中是: FROM WHERE GROUP BY HAVING SELECT ORDER BY TOP 编辑:这个问题或多或少是“ 执行ORDER BY表达式时SQL Server是否应用短路评估吗? ”的答案是有时!我只是还没有找到一个合理的理由。参见编辑#4。 现在假设我有一个这样的声明: 这不是我要执行的真实语句,而只

  • 通常,您可以有多个进程,但有时在某些操作中,我们需要确保在执行前一个进程之后执行一个进程。 我们如何在卡蒙达实现它?试图找到类似进程依赖关系的东西(因此进程在上一个进程完成后才开始),但找不到任何东西:( 我考虑在process中添加一些变量(比如),并检查指定的process是否已经完成,但也许会有更好的解决方案。

  • 我在火花流应用程序中从kafka读取数据并执行两个操作 将dstream插入hbase表A 更新另一个hbase表B 我想确保对于dstream中的每个rdd,插入hbase表A将在对hbase表B进行更新操作之前发生(每个rdd依次发生上述两个动作) 如何在火花流应用中实现这一点