Vertx:未来结果可用性和编码模式

时间:2019-03-24 16:21:16

标签: vert.x

我对理解Vertx异步模型以及Future的行为有一些疑问...

在我的应用程序的启动代码中,我检查了一些条件,例如数据库访问和其他凭据,然后在启动应用程序核心之前启动了多个管理版本(config verticle,http admin verticle等)。该代码具有以下结构:

Vertx vertx = null;
Vertx.clusteredVertx(opts, ar -> {
  if(ar.failed()) {
     System.exit(-1);
  }
  else {
    vertx = ar.result();
    Future<Void> f1 = asyncStartupFunction_1(...);
    if(f1.failed()) {
      System.exit(-1);
    }
    else { // f1 succeeded
      Future<Void> f2 = asyncStartupFunction_2(...);
      if(f2.failed()) {
         System.exit(-1);
      }
      else {  // f2 succeeded
        ...
      } // f2 succeeded
    } // f1 succeeded
  } // vertx creation OK

asyncStartupFunction_x做一些异步工作(查询数据库或部署垂直记录),然后它们返回代表此工作结果的Future

我本以为一旦进入else区块,相应的未来就会成功。可能工作还没有完成,相应的未来还没有完成吗?因此,因为fx.failed() == false我到达else的那段时间(据我所知)不是?

什么是正确的模式?

1 个答案:

答案 0 :(得分:3)

asyncStartupFunction_1返回一个Future,并且不能保证将来会完成。

因此,f1.failed()很有可能无法给出正确的结果。这不是阻塞呼叫,它可能仅由于将来尚未完成而返回false

您需要的是async coordination。根据需要,您可以并行或顺序执行异步作业。