私は ConfigRetriever と彼のリッスン機能に苦労しています。新しい Config がバーティクルに渡され、それらがそれを消費することを望みます。
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);
});
}
}
現時点では、すべてのバーティクルをアンデプロイし、新しい構成で再デプロイします。衝突を避けるために、新しいバーティクルをデプロイする前に、すべてのバーティクルがアンデプロイされるまで待つ必要がありました。
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;
}
}
});
}
しかし、これは悪い解決策のようです。展開されたバーティクルに委任したい。少し検索した後、次のようにイベントバスを介して変更を伝える方法を見つけました
Configretriever リスナーで
eventbus.publish("config.new",changedConf)
頂点で
eventbus.consumer("config.new", handler ->{
config().clear().mergeIn(handler.body());
//do some stuff
}
すべてのバーティクルが、変更された構成にどのように反応するかを独自に決定するため、これは良いアプローチのように思えます。
しかし今、私はバーティクルが古い構成でセットアップを作成し、これらすべての設定を簡単な方法で変更することができないという問題があります.(例としてhttpserverのように)
で試してみました
this.stop()
しかし、実行するVerticleには影響しませんでした
this.start()
また、プロセスを2倍にしますが、古い構成を使用します。
JsonObject を操作し、後で操作しようとして失敗しました。
この問題を解決する方法はありますか、それとも再デプロイがリクエストの変更を処理する最善の方法ですか?