Композитное Будущее не завершается - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю с Vert.x и MainVerticle написано в Java. Мне нужно развернуть различные типы статей в настраиваемом количестве экземпляров. Вот почему я попытался создать Список фьючерсов, и после этого я мог бы использовать CompositeFuture.all () для завершения процесса.

Проблема в том, что составное будущее никогда не вызывает обработчик. Для каждой вертикали появляется сообщение [>] Развернутая вертикаль ... . Но, в конце концов, сообщение [>] Развертывание статей завершено никогда не появляется. Версии работают, но мне нужно выполнить другие действия, когда все развертывания будут готовы.

Это фрагмент:


  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();
 }

1 Ответ

0 голосов
/ 22 апреля 2020

Есть несколько условий в методе начала для статей. В некоторых случаях для первоначального экземпляра обещание не было выполнено.

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

   /*
   * Some async conditions logic
   */ 

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