Apache Geode - 使用来自客户端的相同代码在基于 DUnit 的测试服务器/远程服务器上创建区域

问题描述 投票:0回答:1

我尝试重用以下文档中的代码: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);
client-server remote-server geode dunit
1个回答
0
投票

我遇到的第一个问题是 缓存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)并尝试重新使用它。

© www.soinside.com 2019 - 2024. All rights reserved.