3.4、在主Verticle部署其它的Verticle

我们还有一个MainVerticle类,而不是像第一次迭代一样包含所有的业务逻辑,它的唯一目的就是引导应用程序并部署其他的Verticle。

该代码包括部署1个WikiDatabaseVerticle实例和2个HttpServerVerticle实例:

public class MainVerticle extends AbstractVerticle {

  @Override
  public void start(Future<Void> startFuture) throws Exception {

    Future<String> dbVerticleDeployment = Future.future();  (1)
    vertx.deployVerticle(new WikiDatabaseVerticle(), dbVerticleDeployment.completer());  (2)

    dbVerticleDeployment.compose(id -> {  (3)

      Future<String> httpVerticleDeployment = Future.future();
      vertx.deployVerticle(
        "io.vertx.guides.wiki.HttpServerVerticle",  (4)
        new DeploymentOptions().setInstances(2),    (5)
        httpVerticleDeployment.completer());

      return httpVerticleDeployment;  (6)

    }).setHandler(ar -> {   (7)
      if (ar.succeeded()) {
        startFuture.complete();
      } else {
        startFuture.fail(ar.cause());
      }
    });
  }
}
  1. 部署Verticle是一个异步操作,所以我们需要一个Future。使用字符串 参数类型是因为在成功部署时,Verticle可以获取标识符;
  2. 一个选项是使用new创建一个Verticle实例,并将对象引用传递给deploy Verticle方法。completer方法的返回值是一个完成Future的简单处理程序;
  3. 使用compose进行顺序组合允许异步操作在另一个之后运行;当初始的Future成功完成时,将调用组合函数;
  4. 字符串的类名也是指定要部署的Verticle的一种方式。对于其他JVM语言 ,基于字符串的约定允许指定一个模块/脚本;
  5. DeploymentOption类允许指定多个参数,特别是部署实例的数量;
  6. 组合函数返回下一个Future,其完成将触发组合操作的完成 ;
  7. 我们定义一个处理程序,最终完成MainVerticle起始的Future。

精明的读者可能会想知道如何在同一个TCP端口上部署HTTP服务器的代码两次,并且不希望任何一个实例出现任何错误,因为TCP端口已经被使用了。使用许多Web框架,我们需要选择不同的TCP端口,并且有一个前端HTTP代理端口之间以进行负载平衡。

由于多个Verticle可以共享相同的TCP端口,因此无需对Vert.x执行此操作。 进来的连接只是以循环(round-robin)方式从接收线程中分发。

results matching ""

    No results matching ""