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());
}
});
}
}
- 部署Verticle是一个异步操作,所以我们需要一个Future。使用字符串 参数类型是因为在成功部署时,Verticle可以获取标识符;
- 一个选项是使用new创建一个Verticle实例,并将对象引用传递给deploy Verticle方法。completer方法的返回值是一个完成Future的简单处理程序;
- 使用compose进行顺序组合允许异步操作在另一个之后运行;当初始的Future成功完成时,将调用组合函数;
- 字符串的类名也是指定要部署的Verticle的一种方式。对于其他JVM语言 ,基于字符串的约定允许指定一个模块/脚本;
- DeploymentOption类允许指定多个参数,特别是部署实例的数量;
- 组合函数返回下一个Future,其完成将触发组合操作的完成 ;
- 我们定义一个处理程序,最终完成MainVerticle起始的Future。
精明的读者可能会想知道如何在同一个TCP端口上部署HTTP服务器的代码两次,并且不希望任何一个实例出现任何错误,因为TCP端口已经被使用了。使用许多Web框架,我们需要选择不同的TCP端口,并且有一个前端HTTP代理端口之间以进行负载平衡。
由于多个Verticle可以共享相同的TCP端口,因此无需对Vert.x执行此操作。 进来的连接只是以循环(round-robin)方式从接收线程中分发。