我的应用程序是API服务器,据认为其组织如下:
MainVerticle
在启动时被调用,应创建所有必需的对象以使应用程序正常工作。主要是一个mongoDB连接池(MongoClient.createShared(...)
)和一个实例范围内可用的全局配置对象。它还将启动HTTP侦听器,即HttpVerticle
的多个实例。
HttpVerticle
负责接收请求,并根据有效负载中的命令xxx
执行XxxHandler.handle(...)
方法。
大多数XxxHandler.handle(...)
方法将需要访问数据库。另外,其他一些还将使用全局conf中的参数部署其他顶点。例如,LoginHandler.handle(...)
将部署一个竖版以保持用户连接时的状态,而当用户注销时该竖版将不被部署。
我无法弄清楚如何在XxxHandler.handle(...)
或“ sub” -vertical中获取全局配置对象。对于mongo客户也一样。
第一季度:对于配置数据,我尝试使用SharedData
。在`MainVerticle.start()中,我有:
LocalMap<String, String> lm = vertx.sharedData().getLocalMap("conf");
lm.put("var", "val");
在`HttpVerticle.start()中,我有:
LocalMap<String, String> lm = vertx.sharedData().getLocalMap("conf");
log.debug("var={}", lm.get("var"));
但是日志输出为var=null
....我在做什么错了?
Q2 :除了具有<String, String>
映射类型的基本示例外,如果值是JsonObject
之类的可变对象,而实际上正是我所需要的?>
第3季度:最后如何使mongo客户端实例可用于所有顶点?
答案 0 :(得分:0)
您应该使用getLocalMap()
而不是getClusterWideMap()
。然后,您应该能够处理整个群集中的共享数据,而不仅仅是在一个垂直节点上。
请注意,共享操作是异步的,代码可能类似于(Groovy中的代码):
vertx.sharedData().getClusterWideMap( 'your-name' ){ AsyncResult<AsyncMap<String,String>> res ->
if( res.succeeded() )
res.result().put( 'var', 'val', { log.info "put succeeded: ${it.succeeded()}" } )
}
您应该可以使用地图中的任何Serializable
对象。