1

我与 ConfigRetriever 和他的监听功能斗争。我希望将新的 Config 传递给 Verticle 并让它们使用它。

public class ShredderVerticle extends AbstractVerticle {
    @Override
    public void start(){
        ConfigStoreOptions fileStore = new ConfigStoreOptions()
            .setType("file")
            .setOptional(true)
            .setConfig(
                    new JsonObject().put("path","src/main/java/evilPlan.json")
            );

        ConfigRetrieverOptions options = new ConfigRetrieverOptions()
            .addStore(fileStore)
            .setScanPeriod(1000);

        ConfigRetriever retriever = ConfigRetriever.create(vertx,options);

        retriever.getConfig(ar -> {
            if (ar.failed()) {
                // Failed to retrieve the configuration
            } else {
                vertx.deployVerticle("FooFighterVerticle",
                        new DeploymentOptions().setConfig(ar.result())
            }
        });

        retriever.listen(change ->{
            JsonObject previous = change.getPreviousConfiguration();
            // New configuration
            JsonObject changedConf= change.getNewConfiguration();
            eventBus.publish("conf.new",conf);

        });
    }
}

目前,我只是取消部署所有 Verticle 并使用新配置重新部署它们。在部署新的verticles之前,我需要等到所有verticles都被取消部署以避免碰撞。

for(String deploymentID : vertx.deploymentIDs()) {
        vertx.undeploy(deploymentID, handler -> {
            if(handler.succeeded()){
                logger.info("Undeployed verticle "  + " ID: " + deploymentID);
                counter++;
                if(counter == deploymentNumber) {
                    deploy(changedConf);
                    counter = 0;
                }
            }
        });
    }

但这似乎是一个糟糕的解决方案。我想将它委托给已部署的 Verticle。经过一番小小的搜索,我找到了一种通过事件总线传达变化的方法,例如

在 Configretriever 监听器

eventbus.publish("config.new",changedConf)

在垂直

eventbus.consumer("config.new", handler ->{
    config().clear().mergeIn(handler.body());
    //do some stuff
}

这似乎是一个很好的方法,因为现在所有的 Verticle 都自行决定它们如何对更改的 Config 做出反应。

但是现在我遇到了一个问题,即在旧配置上设置了 teir,并且不可能以简单的方式更改所有这些设置。(例如 httpserver)

我试过了

this.stop()

但它不影响 Verticle 运行

this.start()

也只是将过程加倍,但使用旧配置。

尝试使用 JsonObject 并随后对其进行操作失败。

有没有办法解决这个问题,或者重新部署是处理请求更改的最佳方式?

4

0 回答 0