Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 垂直x';垂直的JSON/YAML配置(每个环境最好)_Java_Kotlin_Vert.x - Fatal编程技术网

Java 垂直x';垂直的JSON/YAML配置(每个环境最好)

Java 垂直x';垂直的JSON/YAML配置(每个环境最好),java,kotlin,vert.x,Java,Kotlin,Vert.x,是否有一种“合理”的方法来配置Vert.x中的部署选项、实例、工作者等 我希望能够在部署时“摆脱”部署选项,并将其保存在Vert.x能够理解的JSON/YAML配置文件中,最好是按“环境”分割,就像Spring Boot那样 这是我目前正在使用的: class MainVerticle : AbstractVerticle() { private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) over

是否有一种“合理”的方法来配置Vert.x中的
部署选项
实例
工作者

我希望能够在部署时“摆脱”部署选项,并将其保存在Vert.x能够理解的JSON/YAML配置文件中,最好是按“环境”分割,就像Spring Boot那样

这是我目前正在使用的:

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

据我所知,没有。但是,您可以对
config.json
deploy(Class,DeploymentOptions)
方法进行一些调整,以获得类似的结果

对于
config.json
,如果您将每个垂直链接的名称更改为限定类名,并且每个垂直链接都有一个
deployment\u options
对象,那么您可以修改
deploy()
来加载选项,而不必在
start
方法中指定它们。在Vert.x中,您可以提供默认配置选项,因此可以执行以下操作:

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))
}
覆盖乐趣开始(未来:未来){
部署(AuthVerticle::class.java)
部署(HttpServerVerticle::class.java)
部署(DialPadVerticle::class.java)
...
}
私人娱乐部署(课堂:课堂){
val options=getDeploymentOptionsFromConfig(clazz)
deployVerticle(clazz.name,选项){handler->
...
}
}
private fun GetDeploymentOptions fromConfig(clazz:Class):DeploymentOptions{
val config=config()
.getJsonObject(clazz.name)
.getJsonObject(“部署选项”)
return-DeploymentOptions()
.setInstances(config.getInteger(“实例”,1))
.setWorker(config.getBoolean(“worker”,false))
}
我发现了,但我仍然认为这应该是一个“核心”功能

在任何情况下,
DeploymentOptions
都接受一个
JsonObject
…这很好。唯一需要注意的是,确保JSON配置文件中的键(当然不包括
config
中的键)与JSON(
DeploymentOptionConverter
)中的方法
的值相同

“部分”解决方案是使用
config.json
如下:

{
  "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
  }
}
…非常类似于
foreksorg/vertx config launcher
的子集,因为我只对配置注入部分感兴趣

最终,(最初发布的)
deploy
方法将如下所示:

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();
    }
  }
}
private-fun部署(clazz:Class){
deployVerticle(clazz.name,DeploymentOptions(config().getJsonObject(clazz.name)?:JsonObject()){handler->
if(handler.successed()){
logger.debug(${clazz.simpleName}已成功启动(部署标识符:${handler.result()})”
}否则{
logger.error(${clazz.simpleName}部署失败,原因是:${handler.cause()}”)
//停止();
}
}
}

是啊!这很酷,但我不想准确地编写
getDeploymentOptions fromconfig
,因为您必须为要包含的键编写代码,这已经在
DeploymentOptions Converter.fromJson
中完成了。几分钟后我将发布另一个解决方案。您在哪里找到解释
DeploymentOptions Converter
工作原理的文档?Java文档也没有提到密钥是如何映射的;我阅读了源代码-Vert.x是开源的。我认为“映射”无论如何都不会被记录下来,所以这更像是一个你必须遵守的惯例,直到“核心”中内置了某种东西或者Vert.x中的官方工件。
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();
    }
  }
}