我与 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 并随后对其进行操作失败。
有没有办法解决这个问题,或者重新部署是处理请求更改的最佳方式?