我正在尝试使用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()方法被调用时,我的配置就消失了。
谢谢。
答案 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/文档中没有此要求的提示。