Совместное использование объектов со всеми вертиками - PullRequest
0 голосов
/ 11 ноября 2018

Мое приложение, сервер API, считается следующим:

  1. MainVerticle вызывается при запуске и должен создавать все необходимые объекты для работы приложения. В основном это пул соединений mongoDB (MongoClient.createShared(...)) и объект глобальной конфигурации, доступный для всего экземпляра. Он также запускает прослушиватель HTTP, несколько экземпляров HttpVerticle.

  2. HttpVerticle отвечает за прием запросов и, основываясь на команде xxx в полезной нагрузке, выполняет метод XxxHandler.handle(...).

  3. Большинству методов XxxHandler.handle(...) потребуется доступ к базе данных. Кроме того, некоторые другие также развернут дополнительные статьи с параметрами из глобального conf. Например, LoginHandler.handle(...) развернет статью, чтобы сохранить состояние пользователя, пока он подключен, и эта статья будет отменена при выходе пользователя из системы.

Я не могу понять, как получить объект глобальной конфигурации, находясь в XxxHandler.handle(...) или в "sub" -витерине То же самое для клиента Монго.

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 : Наконец, как сделать экземпляр клиента Монго доступным для всех вершин?

1 Ответ

0 голосов
/ 11 ноября 2018

Вместо 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 объекты на вашей карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...