【发布时间】:2023-03-03 16:22:01
【问题描述】:
我正在使用 Vert.x 和一个用 Java 编写的 MainVerticle。我需要在可配置数量的实例中部署不同类型的 Verticle。所以,这就是为什么我尝试创建一个期货列表,然后我可以使用 CompositeFuture.all() 来完成该过程。
问题是复合未来永远不会调用处理程序。对于每个verticle,都会出现消息[>] Deployed verticle...。但最后,消息 [>] Verticles 部署完成 永远不会。 verticles 正在工作,但我需要在所有部署人员都准备好后执行其他操作。
这是sn-p:
private Future<Void> loadVerticles()
{
Promise<Void> promise = Promise.promise();
List<Future<Void>> verticleDeployments = new ArrayList<>();
for (Integer i = 0; i < instancesA; i++)
verticleDeployments.add(deployHelper(ApiVerticleA.class.getName()));
for (Integer i = 0; i < instancesB; i++)
verticleDeployments.add(deployHelper(ApiVerticleB.class.getName()));
for (Integer i = 0; i < instancesC; i++)
verticleDeployments.add(deployHelper(ApiVerticleC.class.getName()));
CompositeFuture.all(new ArrayList<>(verticleDeployments)).setHandler( result -> {
if (result.succeeded()) {
System.out.println("[>] Verticles deployment complete"); // This message never appears
promise.complete();
}
else
promise.fail(result.cause());
});
return promise.future();
}
private Future<Void> deployHelper(String name)
{
Promise<Void> promise = Promise.promise();
vertx.deployVerticle(name, res -> {
if(res.failed()) {
System.out.println("[>] Failed to deploy verticle " + name);
promise.fail(res.cause());
} else {
System.out.println("[>] Deployed verticle " + name); // This message is printed for each verticle instance
promise.complete();
}
});
return promise.future();
}
【问题讨论】:
-
我无法重现您的问题。我尝试重新创建您的设置:gist.github.com/hsl43/f607cb067aa3a9d1ba5a28a4f44bfeb3。我的代码和你的代码之间的唯一区别是我只生成了另一种 Verticle (
VerticleB) 的实例,并且我硬编码了要创建的实例数量。最后,记录“Verticles 部署完成”消息。 -
调试应用后发现单实例的start方法有问题。承诺没有完成。我做了修复,一切正常。
-
@Herber230 你见过类 DeploymentOptions 吗?您可以在那里设置实例数而不使用循环
-
谢谢@DidarBurmaganov。没看过那门课,现在我要改代码,因为你提出的解决方案更合适