【问题标题】:Composite Future is not completing复合未来未完成
【发布时间】:2023-03-03 16:22:01
【问题描述】:

我正在使用 Vert.x 和一个用 Java 编写的 MainVerticle。我需要在可配置数量的实例中部署不同类型的 Verticle。所以,这就是为什么我尝试创建一个期货列表,然后我可以使用 CompositeFuture.all() 来完成该过程。

问题是复合未来永远不会调用处理程序。对于每个verticle,都会出现消息[>] Deployed verticle...。但最后,消息 [>] Verticles 部署完成 永远不会。 verticles 正在工作,但我需要在所有部署人员都准备好后执行其他操作。

这是sn-p:


  private Future<Void> loadVerticles() 
  {
    Promise<Void> promise = Promise.promise();

    List<Future<Void>> verticleDeployments = new ArrayList<>();

    for (Integer i = 0; i < instancesA; i++)
      verticleDeployments.add(deployHelper(ApiVerticleA.class.getName()));

    for (Integer i = 0; i < instancesB; i++)
      verticleDeployments.add(deployHelper(ApiVerticleB.class.getName()));

    for (Integer i = 0; i < instancesC; i++)
      verticleDeployments.add(deployHelper(ApiVerticleC.class.getName()));

    CompositeFuture.all(new ArrayList<>(verticleDeployments)).setHandler( result -> {
      if (result.succeeded()) {
        System.out.println("[>] Verticles deployment complete"); // This message never appears
        promise.complete();
      }
      else
        promise.fail(result.cause());
    });

    return promise.future();
  }


  private Future<Void> deployHelper(String name)
  {
    Promise<Void> promise = Promise.promise();
    vertx.deployVerticle(name, res -> {
       if(res.failed()) {
          System.out.println("[>] Failed to deploy verticle " + name);
          promise.fail(res.cause());
       } else {
          System.out.println("[>] Deployed verticle " + name); // This message is printed for each verticle instance
          promise.complete();
       }
    });
    return promise.future();
 }

【问题讨论】:

  • 我无法重现您的问题。我尝试重新创建您的设置:gist.github.com/hsl43/f607cb067aa3a9d1ba5a28a4f44bfeb3。我的代码和你的代码之间的唯一区别是我只生成了另一种 Verticle (VerticleB) 的实例,并且我硬编码了要创建的实例数量。最后,记录“Verticles 部署完成”消息。
  • 调试应用后发现单实例的start方法有问题。承诺没有完成。我做了修复,一切正常。
  • @Herber230 你见过类 DeploymentOptions 吗?您可以在那里设置实例数而不使用循环
  • 谢谢@DidarBurmaganov。没看过那门课,现在我要改代码,因为你提出的解决方案更合适

标签: java vert.x


【解决方案1】:

verticles 的 start 方法中有一些条件。在某些情况下,对于 Verticle 实例,promise 没有完成。

@Override
public void start(Promise<Void> startPromise) {

   /*
   * Some async conditions logic
   */ 

    startPromise.complete(); // Some promises never were completed
}

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2019-10-08
    相关资源
    最近更新 更多