GemFire ​​getRegion() возвращает null, тогда как запрос OQL дает результат

Я использую Pivotal GemFire ​​9.0.0 с 1 локатором и 1 сервером. На сервере есть регион, называемый «представления», как показано ниже:

<gfe:replicated-region id="submissionsRegion" name="submissions" 
statistics="true" template="replicateRegionTemplate">
...
</gfe:replicated-region>

Я получаю Region как null при выполнении следующего кода:

Region<K, V> region = clientCache.getRegion("submissions");

Удивительно, но тот же ClientCache возвращает все записи, когда я запрашиваю с использованием OQL и QueryService, как показано ниже:

String queryString = "SELECT * FROM /submissions";
QueryService queryService = clientCache.getQueryService();
Query query = queryService.newQuery(queryString);
SelectResults results = (SelectResults) query.execute();

Я инициализирую свой ClientCache следующим образом:

ClientCache clientCache = new ClientCacheFactory()
            .addPoolLocator("localhost", 10479)
            .set("name", "MyClientCache")
            .set("log-level", "error")
            .create();

Я действительно озадачен этим. Любой указатель или помощь были бы замечательными.


person Vini    schedule 05.07.2017    source источник


Ответы (2)


Вам также необходимо настроить ClientCache (через cache.xml или чистый GemFire ​​API) с регионами. Используя ваш пример:

ClientRegionFactory regionFactory = clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY);
Region region = regionFactory.create("submissions");

ClientRegionShortcut.PROXY используется только для простоты, вы должны использовать ярлык, который соответствует вашим потребностям.

OQL работает должным образом, поскольку вы получаете QueryService с помощью метода ClientCache.getQueryService() (вместо ClientCache.getLocalQueryService()), поэтому запрос фактически выполняется на стороне сервера.

Дополнительную информацию о настройке топологии клиент/сервер можно получить в клиенте. /Конфигурация сервера.

Надеюсь это поможет.

Ваше здоровье.

person Juan Ramos    schedule 05.07.2017
comment
Спасибо, Уризен, сработало. Однако я понимал, что делает clientCache.getRegion("submissions"). Поскольку я подключился к лоактору с помощью clientCache, он должен был получить мне регион. - person Vini; 06.07.2017
comment
Привет. Вы придумали, как ее решить? Я испытываю такое же поведение. getRegion возвращает null и ClientCacheFactory RegionExistsException. - person korro; 04.09.2017

Да, вам нужно «определить» соответствующий регион на стороне клиента, совпадающий с регионом REPLICATE на стороне сервера по имени (т. е. «представления»). На самом деле это требование не зависит от типа DataPolicy региона сервера (например, REPLICATE или PARTITION).

Это необходимо, поскольку не каждый клиент хочет знать или даже нуждается в данных/событиях из каждого возможного региона сервера. Конечно, это также можно настроить с помощью подписки и «Регистрации интересов» (с помощью Обмен сообщениями о событиях клиент/сервер или CQ).

В любом случае, вы можете полностью избежать использования API GemFire ​​напрямую или даже собственного cache.xml GemFire ​​(настоятельно рекомендуем избегать), используя пространство имен SDG XML...

<gfe:client-cache properties-ref="gemfireProperties" ... />

<gfe:client-region id="submissions" shortcut="PROXY"/>

Или с помощью Spring JavaConfig с SDG API...

@Configuration
class GemFireConfiguration {

  Properties gemfireProperties() {

    Properties gemfireProperties = new Properties();

    gemfireProperties.setProperty("log-level", "config");
    ...

    return gemfireProperties;
  }

  @Bean
  ClientCacheFactoryBean gemfireCache() {

    ClientCacheFactoryBean gemfireCache = new ClientCacheFactoryBean();

    gemfireCache.setClose(true);
    gemfireCache.setProperties(gemfireProperties());
    ...

    return gemfireCache;
  }

  @Bean(name = "submissions");
  ClientRegionFactoryBean submissionsRegion(GemFireCache gemfireCache) {

    ClientRegionFactoryBean submissions = new ClientRegionFactoryBean();

    submissions.setCache(gemfireCache);
    submissions.setClose(false);
    submissions.setShortcut(ClientRegionShortcut.PROXY);
    ...

    return submissions;
  }

  ...
}

Область «представления» может быть заключена в GemfireTemplate, который будет обрабатывать получение "правильного" QueryService от вашего имени при выполнении запросов с использованием find(..) метод.

Конечно, вы можете быть заинтересованы в том, чтобы ваш клиент «предоставил» регион CACHING_PROXY». Конечно, вам тогда нужно будет зарегистрировать «интересы» в ключах или данных интересов. использует критерии запроса для определения данных «интересов».

CACHING_PROXY точно так же, как это звучит, кэширует данные локально в клиенте на основе политик интересов. Это также дает вам возможность использовать «локальный» QueryService для локального запроса данных, избегая сетевого скачка.

Во всяком случае, здесь много вариантов.

Ура, Джон

person John Blum    schedule 06.07.2017