我尝试重用以下文档中的代码:https://geode.apache.org/docs/guide/11/developing/region_options/dynamic_region_creation.html
我遇到的第一个问题是
Cache cache = CacheFactory.getAnyInstance();
Region<String,RegionAttributes<?,?>> regionAttributesMetadataRegion = createRegionAttributesMetadataRegion(cache);
不应在构造函数中执行。如果是,代码在客户端实例中执行,它会失败,而不是服务器错误。修复此问题后,我收到
[fatal 2021/02/15 16:38:24.915 EET <ServerConnection on port 40527 Thread 1> tid=81] Serialization filter is rejecting class org.restcomm.cache.geode.CreateRegionFunction
java.lang.Exception:
at org.apache.geode.internal.ObjectInputStreamFilterWrapper.lambda$createSerializationFilter$0(ObjectInputStreamFilterWrapper.java:233)
问题在于代码是在 dunit MemberVM 上执行的,而所需的类实际上是执行测试的包的一部分。 所以我想我应该以某种方式将类(或者可能是 jar )单独注册到 dunit MemberVM。怎么办?
另一个问题是:当前代码正在检查该区域是否存在,如果不存在则调用该方法。在这两种情况下,它还会尝试创建 clientRegion。问题是这是否是正确的做法?
Region<?,?> cache = instance.getRegion(name);
if(cache==null) {
Execution execution = FunctionService.onServers(instance);
ArrayList argList = new ArrayList();
argList.add(name);
Function function = new CreateRegionFunction();
execution.setArguments(argList).execute(function).getResult();
}
ClientRegionFactory<Object, Object> cf=this.instance.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY).addCacheListener(new ExtendedCacheListener());
this.cache = cf.create(name);
我遇到的第一个问题是 缓存cache = CacheFactory.getAnyInstance(); 不应该在构造函数中执行。如果是,代码在客户端实例中执行,它会失败,而不是服务器错误。修复此问题后,我收到
一旦
Function
在服务器端注册,您可以通过 ID
执行它,而不是通过网络发送对象(因此您不需要在客户端上实例化该函数),在这种情况下,您将还可以避免 Serialization filter
错误。举个例子,FunctionService.onServers(instance).execute(CreateRegionFunction.ID)
。
问题在于代码是在 dunit MemberVM 上执行的,而所需的类实际上是执行测试的包的一部分。所以我想我应该以某种方式将类(或者可能是 jar )单独注册到 dunit MemberVM。怎么办?
事实上,出于安全原因
Geode
不允许序列化/反序列化任意类。内部 Geode
分布式测试使用 MemberVM
并设置一个特殊属性 (serializable-object-filter
) 来规避此问题。 这是一个示例,说明如何在自己的测试中实现这一目标。
另一个问题是:当前代码正在检查该区域是否存在,如果不存在则调用该方法。在这两种情况下,它还会尝试创建 clientRegion。问题是这是否是正确的做法?
如果客户端应用程序使用动态创建的区域,那么是的,您应该创建它,否则您将无法使用它。
顺便说一句,在创建
Geode
时,Region
实现了很多内部逻辑,所以我不建议您自己动态创建区域。相反,建议直接使用 gfsh create region
命令,或者查看它的内部工作原理(参见 here)并尝试重新使用它。