0

我正在尝试重用以下文档中的代码: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);

BR Yulian Oifa

4

1 回答 1

0

我遇到的第一个问题是 Cache cache = CacheFactory.getAnyInstance(); 不应在构造函数中执行。如果是这样,代码是在客户端实例中执行的,它会因非服务器错误而失败。当这个修复时我收到

Function服务器端注册后,您可以执行它,ID而不是通过网络发送对象(因此您不需要在客户端上实例化该函数),在这种情况下您也可以避免Serialization filter错误。例如,FunctionService.onServers(instance).execute(CreateRegionFunction.ID).

问题是代码正在 dunit MemberVM 上执行,而所需的类实际上是执行测试的包的一部分。所以我想我应该以某种方式将类(或者可能是 jar)分别注册到 dunit MemberVM。怎么做?

实际上,出于安全原因Geode,不允许序列化/反序列化任意类。内部Geode分布式测试使用MemberVMand 设置一个特殊的属性 ( serializable-object-filter) 来规避这个问题。这是一个示例,说明如何在自己的测试中实现这一目标。

另一个问题是:当前代码正在检查该区域是否存在,如果不存在则调用该方法。在这两种情况下,它还尝试创建 clientRegion。问题是这是否是正确的方法?

如果客户端应用程序使用动态创建的区域,那么是的,您应该创建它,否则您将无法使用它。


Geode附带说明一下,在创建 a 时实现了很多内部逻辑,Region因此我不建议您自己动态创建区域。相反,建议gfsh create region直接使用该命令,或者查看它在内部的工作方式(参见此处)并尝试重新使用它。

于 2021-02-15T15:33:29.010 回答