Verticle (s) de Vert.x configuration JSON / YAML (preferible por entorno)

¿Existe una forma "razonable" de configurar deployment options , instances , worker , etc. en Vert.x?

Me gustaría poder "deshacerme" de DeploymentOptions durante la implementación y tenerlo en un file de configuration JSON / YAML que de alguna manera entienda Vert.x, preferiblemente dividido por "entornos", de la misma manera que lo hace Spring Boot.

Esto es lo que estoy usando actualmente:

 class MainVerticle : AbstractVerticle() { private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) override fun start(future: Future<Void>) { val config = config().getJsonObject("verticle_instances") deploy(AuthVerticle::class.java, DeploymentOptions().setInstances(config.getInteger("auth_instances"))) deploy(HttpServerVerticle::class.java, DeploymentOptions().setConfig(config().getJsonObject("http_server_verticle")) .setInstances(config.getInteger("http_server_instances"))) deploy(DialPadVerticle::class.java, DeploymentOptions().setConfig(config().getJsonObject("phone_verticle")) .setWorker(true)) logger.info("Module(s) and/or verticle(s) deployment...DONE") future.complete() } override fun stop(future: Future<Void>) { logger.debug("Undeploying verticle(s)...DONE") logger.info("Application stopped successfully. Enjoy the elevator music while we're offline...") future.complete() } private fun deploy(clazz: Class<out AbstractVerticle>, options: DeploymentOptions) { vertx.deployVerticle(clazz.name, options) { handler -> if (handler.succeeded()) { logger.debug("${clazz.simpleName} started successfully (deployment identifier: ${handler.result()})") } else { logger.error("${clazz.simpleName} deployment failed due to: ${handler.cause()}") //stop(); } } } } 

… y config.json :

 { "verticle_instances": { "auth_instances": 3, "http_server_instances": 6 }, "http_server_verticle": { "hostname": "0.0.0.0", "port": 9080, "cert_path": "server-cert.pem", "key_path": "server-key.pem", "use_alpn": true, "use_ssl": true } } 

Por lo que yo sé, no. Sin embargo, podría hacer algunos ajustes en su config.json y su método deploy(Class, DeploymentOptions) para lograr un resultado similar.

Para config.json , si cambia el nombre de cada verticle al nombre de class calificado y tiene un object deployment_options para cada verticle, puede modificar deploy() para cargar las opciones sin tener que especificarlas en su método de start . En Vert.x, puede proporcionar opciones de configuration pnetworkingeterminadas, por lo que podría hacer algo como:

 override fun start(future: Future<Void>) { deploy(AuthVerticle::class.java) deploy(HttpServerVerticle::class.java) deploy(DialPadVerticle::class.java) ... } private fun deploy(clazz: Class<out AbstractVerticle>) { val options = getDeploymentOptionsFromConfig(clazz) vertx.deployVerticle(clazz.name, options) { handler -> ... } } private fun getDeploymentOptionsFromConfig(clazz: Class<out AbstractVerticle>): DeploymentOptions { val config = config() .getJsonObject(clazz.name) .getJsonObject("deployment_options") return DeploymentOptions() .setInstances(config.getInteger("instances", 1)) .setWorker(config.getBoolean("worker", false)) } 

Encontré Vert.x Config Launcher , pero aún así, creo que debería ser una funcionalidad "core".

En cualquier caso, DeploymentOptions acepta un JsonObject … y eso está bien. La única advertencia es asegurarse de que las keys en el file de configuration JSON (sin include las que están dentro de la config , por supuesto) son las mismas que los valores que el método de fromJson ( DeploymentOptionsConverter ) está "esperando".

La solución "parcial" sería tener un config.json como:

 { "io.shido.core.verticle.AuthVerticle": { }, "io.shido.core.verticle.DialPadVerticle": { }, "io.shido.core.verticle.HttpServerVerticle": { "config": { "hostname": "0.0.0.0", "port": 9081, "certPath": "server-cert.pem", "keyPath": "server-key.pem", "useAlpn": true, "useSsl": true }, "instances": 5 } } 

… bastante similar a un subset de foreksorg/vertx-config-launcher , ya que solo estoy interesado en la parte de inyección de configuration .

Eventualmente, el método de deploy (inicialmente publicado) se verá así:

 private fun deploy(clazz: Class<out AbstractVerticle>) { vertx.deployVerticle(clazz.name, DeploymentOptions(config().getJsonObject(clazz.name) ?: JsonObject())) { handler -> if (handler.succeeded()) { logger.debug("${clazz.simpleName} started successfully (deployment identifier: ${handler.result()})") } else { logger.error("${clazz.simpleName} deployment failed due to: ${handler.cause()}") //stop(); } } } 
  • El código de Vertx Sync se ejecuta varias veces
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • "La respuesta ya se ha escrito" con Vertx
  • Cómo crear verticle de fábrica en VertX?
  • Retrofit-Vertx con RxJava2 en Kotlin IllegalStateException message == null
  • Sirve favicon.ico y otros files estáticos con VertX
  • Vert.x. ¿Cómo crear una aplicación de JVM políglota real?