2.5、维基Verticle初始化阶段

为了使我们的wiki运行,我们需要执行两阶段初始化:

1、我们需要建立一个JDBC数据库连接,并确保数据库模式
到位;

2、我们需要为Web应用程序启动一个HTTP服务器。

每个阶段都可能失败(例如,HTTP服务器TCP端口已被使用),并且这两个阶段不应该并行运行,因为Web应用程序代码首先需要数据库访问。

为了使我们的代码更清晰,我们将为每个阶段定义一个方法,并采用返回future/承诺对象的模式,以在每个阶段完成时通知, 以及是否成功:

private Future<Void> prepareDatabase() {
  Future<Void> future = Future.future();
  // (...)
  return future;
}

private Future<Void> startHttpServer() {
  Future<Void> future = Future.future();
  // (...)
  return future;
}

通过使每个方法返回future对象, 启动方法的实现成为一个组合:

@Override
public void start(Future<Void> startFuture) throws Exception {
  Future<Void> steps = prepareDatabase().compose(v -> startHttpServer());
  steps.setHandler(startFuture.completer());
}

当prepareDatabase的future成功完成后,将调用startHttpServer,并根据startHttpServer返回的future结果来完成以下步骤。 如果prepareDatabase遇到错误,startHttpServer不会被调用,在这种情况下,future的步骤处于失败状态,并且会以描述错误的异常完成。

最终steps完成:setHandler定义一个完成后调用的处理程序。在我们的例子中,我们只需要使用steps完成startFuture,并使用startFuture的completer方法来获取处理程序。 这相当于:

Future<Void> steps = prepareDatabase().compose(v -> startHttpServer());
steps.setHandler(ar -> {
  if (ar.succeeded()) {
    startFuture.complete();
  } else {
    startFuture.fail(ar.cause());
  }
});

ar参数的类型为AsyncResult <Void>。 AsyncResult <T>用于传递异步处理的结果,并且可能在成功时产生类型T的值,或者处理失败时出现故障异常。

results matching ""

    No results matching ""