无法理解vert.x配置加载

时间:2019-05-18 16:46:33

标签: vert.x

我正在尝试使用config.json创建一个verticle,但没有阅读文档后遇到的期望。我将尽最大努力解释我已采取的步骤,但是我尝试了对Verticle的启动步骤进行多种更改,因此我可能不是100%准确的。这是使用vert.x 3.7.0。

首先,当我将配置文件包含在预期位置conf / config.json中时,我已经成功使用我的配置启动了verticle:

[
  {'brand name': 'Nike', 'country name': 'China'}, 
  {'brand name': 'Adidas', 'price': '$150'}
]

并使用启动器传递配置以启动verticle(伪代码):

{
  "database" : {
    "port" : 5432,
    "host" : "127.0.0.1",
    "name" : "linked",
    "user" : "postgres",
    "passwd" : "postgres",
    "connectionPoolSize" : 5
  },
  "chatListener" : {
    "port" : 8080,
    "host" : "localhost"
  }
}

public static void main(String[] args){
    //preprocessing
    Launcher.executeCommand("run", "MyVerticle")
    ...

都可以正常工作。我的配置已加载,我可以从我的顶点内的config()中提取数据:

public static void main(String[] args){
    //preprocessing
    Launcher.executeCommand("run", "MyVerticle -config conf/config.json")
    ...

但是当我将不是默认位置的文件引用传递给启动器时,

JsonObject chatDbOpts = new JsonObject().put( "config", config.getJsonObject( "database" ) );
....

它将忽略它,并使用内置配置,该配置为空,忽略我的配置。但是vertx Config加载器的调试输出表明它正在使用默认位置:

$ java -jar vert.jar -config /path/to/config.json

实际上不做,因为我的配置文件在那里。因此,在CLI上指定其他配置时,配置加载程序不会从默认位置加载。

因此,我更改了代码以消化main中的配置,并确认可以找到并读取json文件。然后将文件引用传递给启动器,但行为相同。因此,然后我更改为在deployVerticle中使用DeploymentOptions对象。

我的预处理器步骤的输出,该步骤用于加载配置并将其转换为JsonObject:

conf/config.json

此JsonObject用于创建DeploymentOptions参考:

Command line arguments: [-conf, d:/cygwin64/home/rcoe/conf/config.json]
Launching application with the following config:
{
  "database" : {
    "port" : 5432,
    "host" : "127.0.0.1",
    "name" : "linked",
    "user" : "postgres",
    "passwd" : "postgres",
    "connectionPoolSize" : 5
  },
  "chatListener" : {
    "port" : 8080,
    "host" : "localhost"
  }
}

没用。

因此,我尝试创建一个空的DeploymentOptions引用并设置配置:

DeploymentOptions options = new DeploymentOptions(jsonCfg);
Vertx.vertx().deployVerticle( getClass().getName(), options );

也无法通过我想要的配置。而是从默认位置使用config。

这是顶点启动的输出。它正在使用conf / config.json文件,

DeploymentOptions options = new DeploymentOptions();
Map<String,Object> m = new HashMap<>();
m.put("config", jsonObject);
JsonObject cfg = new JsonObject(m);
options.setConfig( cfg );
Vertx.vertx().deployVerticle( getClass().getName(), options );

与为DeploymentOptions参考提供的配置相反:

Config file path: conf\config.json, format:json
-Dio.netty.buffer.checkAccessible: true
-Dio.netty.buffer.checkBounds: true
Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@552c2b11
Config options:
{
  "port" : 5432,
  "host" : "not-a-real-host",
  "name" : "linked",
  "user" : "postgres",
  "passwd" : "postgres",
  "connectionPoolSize" : 5
}

无论如何,希望这些步骤有意义,并表明我已经尝试了多种方法来加载自定义配置。我已经看到我的配置传递到负责调用verticle的vert.x代码中,但是当我的verticle的start()方法被调用时,我的配置就消失了。

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,编写问题可以更好地了解问题。据我了解,解决方案是始终使用名为“ config”的键和要传递的JsonObject的值来创建映射。

要部署:

private void launch( final JsonObject jsonObject )
{
    DeploymentOptions options = new DeploymentOptions();
    Map<String, Object> m = new HashMap<>();
    m.put( "config", jsonObject );
    JsonObject cfg = new JsonObject( m );
    options.setConfig( cfg );
    Vertx.vertx().deployVerticle( MainVerticle.class.getName(), options );
}

@override
public void start( final Future<Void> startFuture )
{
    ConfigRetriever cfgRetriever = ConfigRetriever.create( vertx.getDelegate() );

    cfgRetriever.getConfig( ar -> {
        try {
            if( ar.succeeded() ) {
                JsonObject config = ar.result();

                JsonObject cfg = config.getJsonObject( "config" );

                JsonObject chatDbOpts = cfg.getJsonObject( "database" );
                LOGGER.debug( "Launching ChatDbServiceVerticle with the following config:\n{}",
                             chatDbOpts.encodePrettily() );

                JsonObject chatHttpOpts = cfg.getJsonObject( "chatListener" );
                LOGGER.debug( "Launching HttpServerVerticle with the following config:\n{}",
                             chatHttpOpts.encodePrettily() );
...

产生输出:

Launching ChatDbServiceVerticle with the following config:
{
  "port" : 5432,
  "host" : "127.0.0.1",
  "name" : "linked",
  "user" : "postgres",
  "passwd" : "postgres",
  "connectionPoolSize" : 5
}
Launching HttpServerVerticle with the following config:
{
  "port" : 8080,
  "host" : "localhost"
}

但是,如果config()忽略了任何无法使用特定键检索的对象,这就会引出一个关于DeploymentOptions(JsonObject)构造函数的问题?它需要逐步调试器才能找到。 https://vertx.io/blog/vert-x-application-configuration/文档中没有此要求的提示。