0

我的应用程序,一个 API 服务器,被认为是按如下方式组织的:

  1. MainVerticle在启动时调用,应该为应用程序工作创建所有必要的对象。主要是一个 mongoDB 连接池 ( MongoClient.createShared(...)) 和一个在实例范围内可用的全局配置对象。它还启动 HTTP 侦听器,一个HttpVerticle.

  2. HttpVerticle负责接收请求,根据xxxpayload中的命令执行XxxHandler.handle(...)方法。

  3. 大多数XxxHandler.handle(...)方法都需要访问数据库。此外,其他一些人还将使用来自全局 conf 的参数部署额外的 verticles。例如LoginHandler.handle(...),将部署一个 verticle 以在他连接时保持用户状态,并且当用户注销时,该 verticle 将被取消部署。

我不知道如何在“子”-verticle 中XxxHandler.handle(...)或在“子”-verticle 中获取全局配置对象。对于 mongo 客户端也是如此。

Q1:对于配置数据,我尝试使用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,就像我真正需要的那样怎么办?

Q3:最后如何让mongo客户端的实例对所有的verticles可用?

4

1 回答 1

0

而不是getLocalMap()你应该使用getClusterWideMap(). 然后,您应该能够在整个集群中操作共享数据,而不仅仅是在一个 Verticle 中。

请注意,共享操作是异步的,代码可能类似于(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地图中的任何对象。

于 2018-11-11T13:12:49.860 回答