无法在Geode中从客户端动态创建区域

时间:2018-06-13 09:00:59

标签: 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();

3 个答案:

答案 0 :(得分:1)

我真的建议您使用gfshspring data geode来创建该区域。

如果要使用该功能在服务器上创建区域,则需要执行以下步骤:

  1. docs page创建一个包含CreateRegionFunctionCreateRegionCacheListener的jar。
  2. 确保服务器可以使用jar(使用gfsh deploy命令,或者在启动服务器时将jar添加到类路径中。
  3. 从客户端代码中删除以下行:FunctionService.registerFunction(function);
  4. 然后运行您的客户端代码。
  5. 同样,我认为使用gfsh来创建区域要容易得多。

答案 1 :(得分:1)

  • 在官方文档中有一个CreateRegionFunction,其中有

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

  • 通过这种方式,如果您创建clientcache并像我一样使用execution.execute运行该功能,则该功能将无法在服务器上运行。

  • 然后我发现官方doc的方法似乎已经过时了。似乎没有必要创建_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()); }

答案 2 :(得分:0)

出现错误的原因是因为您在构造函数中调用了CacheFactory.getAnyInstance()createRegionAttributesMetadataRegion()。 您从客户端调用了CreateRegionFunction()构造函数。这样就得到了ClientCache而不是Cache的实例。之后,您尝试在不支持的ClientCache中创建一个RegionAttributesMetadataRegion

一旦在execute函数中移动了它,它就不会在构造函数(在您的客户端中)中被调用,而仅在服务器中的execute中被调用。我猜这是Geode文档中的错误。

PS:感谢您的帖子。我要放弃动态区域创建,直到发现它对其他人有用。