首页 > 解决方案 > Vertx:未来的结果可用性和编码模式

问题描述

我在理解 Vertx 异步模型以及Future行为方式方面存在一些问题......

在我的应用程序的启动代码中,我检查了一些条件,例如 db 访问和其他凭据,然后在启动应用程序的核心之前启动了几个管理 verticle(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

什么是正确的模式?

标签: vert.x

解决方案


asyncStartupFunction_1返回 aFuture并且不能保证 future 在此时完成。

因此f1.failed()很有可能不会给你一个正确的结果。这不是阻塞调用,它可能false只是因为未来尚未完成而返回。

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


推荐阅读