与所有顶点实例共享对象

时间:2018-11-11 05:18:49

标签: vert.x vertx-verticle

我的应用程序是API服务器,据认为其组织如下:

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

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

  3. 大多数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客户端实例可用于所有顶点?

1 个答案:

答案 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对象。