Java 成功部署verticle,但出现以下错误:结果已完成:成功
我成功地部署了垂直,但仍然出现以下错误:结果已完成:成功。我不明白为什么,我需要一些解释这是我的部署类:Java 成功部署verticle,但出现以下错误:结果已完成:成功,java,vert.x,Java,Vert.x,我成功地部署了垂直,但仍然出现以下错误:结果已完成:成功。我不明白为什么,我需要一些解释这是我的部署类: public class Deploy { private static Logger logger = LogManager.getLogger(Deploy.class); private static void deployAsynchronousVerticalByIndex(Vertx vertx, int indexCurrentDeploy, JsonArray vertic
public class Deploy {
private static Logger logger = LogManager.getLogger(Deploy.class);
private static void deployAsynchronousVerticalByIndex(Vertx vertx, int indexCurrentDeploy, JsonArray verticalArray, Future<Void> startFuture, JsonObject jsonObjectConfig) {
JsonObject currentVertical = verticalArray.getJsonObject(indexCurrentDeploy);
currentVertical.forEach(entry -> {
logger.debug("Starting deploy of class: " + entry.getKey() + ", With the config: " + entry.getValue() + ".");
DeploymentOptions optionsDeploy = new DeploymentOptions().setConfig(jsonObjectConfig);
ObservableFuture<String> observable = RxHelper.observableFuture();
vertx.deployVerticle(entry.getKey(), optionsDeploy, observable.toHandler());
observable.subscribe(id -> {
logger.info("Class " + entry.getKey() + " deployed.");
if (indexCurrentDeploy + 1 < verticalArray.size()) {
deployAsynchronousVerticalByIndex(vertx, indexCurrentDeploy + 1, verticalArray, startFuture, jsonObjectConfig);
} else {
logger.info("ALL classes are deployed.");
startFuture.complete();
}
}, err -> {
logger.error(err, err);
startFuture.fail(err.getMessage());
});
});
}
public static void deployAsynchronousVertical(Vertx vertx, JsonArray verticalArray, Future<Void> startFuture, JsonObject jsonObjectConfig) {
deployAsynchronousVerticalByIndex(vertx, 0, verticalArray, startFuture, jsonObjectConfig);
}
}这是因为你在垂直线之间重复使用你的未来,并且在那里有一个比赛条件 解决这一问题的最简单方法是:
if (startFuture.isComplete()) {
startFuture.complete();
}
但这实际上只会掩盖问题
从循环中提取你的可观察对象,这样它实际上只会对每个眩晕听一次
JsonObject currentVertical = verticalArray.getJsonObject(indexCurrentDeploy);
ObservableFuture<String> observable = RxHelper.observableFuture();
currentVertical.forEach(entry -> {
logger.debug("Starting deploy of class: " + entry.getKey() + ", With the config: " + entry.getValue() + ".");
DeploymentOptions optionsDeploy = new DeploymentOptions().setConfig(jsonObjectConfig);
vertx.deployVerticle(entry.getKey(), optionsDeploy, observable.toHandler());
});
observable.subscribe(id -> {
logger.info("Class " + id + " deployed.");
if (indexCurrentDeploy + 1 < verticalArray.size()) {
deployAsynchronousVerticalByIndex(vertx, indexCurrentDeploy + 1, verticalArray, startFuture, jsonObjectConfig);
} else {
logger.info("ALL classes are deployed.");
if (startFuture.isComplete()) {
startFuture.complete();
}
}
}, err -> {
logger.error(err, err);
startFuture.fail(err.getMessage());
});
除了从循环中提取你的可观测数据, 最好使用io.vertx.core.Promise而不是io.vertx.core.Future。 并使用promise.tryxxx 根据io.vertx.core.Promise.java文档: 未来是不推荐的。相反,使用承诺 tryFail类似于失败,但当承诺已经兑现时返回false 已完成,而不是引发IllegalStateException。它回来了 反之亦然 所以。。。 而不是
if (startFuture.isComplete())
startFuture.complete();
if (startFuture.isFail())
startFuture.fail(err.getMessage());
使用
非常感谢@alexey的帮助我是vert.x的新手,这是一个完美的答案:
promise.tryComplete()
promise.tryFail(err.getMessage());