Невозможно динамически создать регион из клиента в Geode

  • Я хочу создать новый регион из клиента, которого нет на сервере.
  • Следуя официальному документу Динамическое создание регионов, есть только функции на стороне сервера, но нет кода на стороне клиента.
  • Я пытаюсь вызвать CreateRegionFunction из клиентского кеша, но получаю сообщение об ошибке: Исключение в потоке "main" java.lang.UnsupportedOperationException: операция не поддерживается в клиентском кеше

Вот мой клиентский код:

ClientCache cache = new ClientCacheFactory()
    .addPoolLocator("<hostname>", 10334)
    .set("log-level", "WARN")
    .create();
Execution execution2 = FunctionService.onServers(cache);
ArrayList argList = new ArrayList();
argList.add("region_new");
RegionAttributes attr = new AttributesFactory().create();
argList2.add(attr);
Function function = new CreateRegionFunction();
FunctionService.registerFunction(function);
Object result = execution.setArguments(argList).execute(function).getResult();

person Galvin Yang    schedule 13.06.2018    source источник


Ответы (3)



  • В официальном документе есть CreateRegionFunction, в котором есть

    public CreateRegionFunction() { this.cache = CacheFactory.getAnyInstance(); this.regionAttributesMetadataRegion = createRegionAttributesMetadataRegion(); }

  • Таким образом, если вы создадите clientcache и запустите функцию, используя execution.execute, как это сделал я, функция не будет работать на сервере.

  • Затем я обнаружил, что метод официального документа кажется устаревшим. Кажется, нет необходимости создавать _regionAttributesMetadata. Мы можем создать регион напрямую, как показано ниже:

    public void execute(FunctionContext context) { cache = CacheFactory.getAnyInstance(); regionAttributesMetadataRegion = createRegionAttributesMetadataRegion(); ArrayList arguments = (ArrayList) context.getArguments(); String regionName = (String) arguments.get(0); PartitionAttributes partition = new PartitionAttributesFactory().setColocatedWith("/region1").create(); Region region = cache.createRegionFactory().setDataPolicy(DataPolicy.PERSISTENT_PARTITION ).setPartitionAttributes(partition).create(regionName); // Return status context.getResultSender().lastResult(region.toString()); }

person Galvin Yang    schedule 14.06.2018
comment
Когда вы пытаетесь масштабировать геодезический кластер, добавляя дополнительные серверы, вы хотите, чтобы эти новые серверы создавали регионы, которые уже были созданы на существующих серверах. Способ добиться этого — использовать регион __regionAttributesMetadata вместе с CreateRegionCacheListener в этом регионе. - person Swapnil; 20.06.2018
comment
Спасибо! Похоже, я неправильно понял смысл динамического создания региона. - person Galvin Yang; 22.06.2018

Причина, по которой вы получали ошибку, заключается в том, что вы вызывали CacheFactory.getAnyInstance() и createRegionAttributesMetadataRegion() в конструкторе. Вы вызываете конструктор CreateRegionFunction() из своего клиента, правильно. Таким образом, вы получаете экземпляр вашего ClientCache, а не Cache. После этого вы пытаетесь создать RegionAttributesMetadataRegion в своем ClientCache, что не поддерживается.

После того, как вы переместили это в функцию execute, она не вызывается в конструкторе (который находится в вашем клиенте), а вызывается только при выполнении на вашем сервере. Я предполагаю, что это ошибка в документах Geode.

PS: спасибо за ваш пост. Я собирался отказаться от создания динамического региона, пока не обнаружил, что это работает для кого-то другого.

person mave_rick    schedule 11.04.2019