这是我的客户端代码:
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();
答案 0 :(得分:1)
我真的建议您使用gfsh
或spring data geode来创建该区域。
如果要使用该功能在服务器上创建区域,则需要执行以下步骤:
CreateRegionFunction
和CreateRegionCacheListener
的jar。 gfsh deploy
命令,或者在启动服务器时将jar添加到类路径中。FunctionService.registerFunction(function);
同样,我认为使用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:感谢您的帖子。我要放弃动态区域创建,直到发现它对其他人有用。