成功部署Verticle但我收到此错误:结果已经完成:成功

时间:2021-11-14 18:01:36

i succeeded in deploying vertical but i still got this error : Result is already complete: succeeded. I don't understand why, I need some explanation this is my Deploy class :

我成功部署了垂直但我仍然遇到此错误:结果已经完成:成功。我不明白为什么,我需要一些解释这是我的部署类:

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);
}

}

1 个解决方案

#1


3  

That's because you reuse your future between verticles, and have a race condition there.

那是因为你在Verticle之间重用你的未来,并在那里有竞争条件。

Simplest way to fix that would be :

最简单的解决方法是:

if (startFuture.isComplete()) {
   startFuture.complete();    
}

But that actually would only obscure the problem.

但这实际上只会掩盖这个问题。

Extract your observable out of the loop, so it actually would listen only once for every vertice.

将你的observable从循环中提取出来,所以它实际上只会为每个顶点监听一次。

    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());
    });

#1


3  

That's because you reuse your future between verticles, and have a race condition there.

那是因为你在Verticle之间重用你的未来,并在那里有竞争条件。

Simplest way to fix that would be :

最简单的解决方法是:

if (startFuture.isComplete()) {
   startFuture.complete();    
}

But that actually would only obscure the problem.

但这实际上只会掩盖这个问题。

Extract your observable out of the loop, so it actually would listen only once for every vertice.

将你的observable从循环中提取出来,所以它实际上只会为每个顶点监听一次。

    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());
    });