如何解决Apache Geode - 使用来自客户端的相同代码在基于 DUnit 的测试服务器/远程服务器上创建区域
我正在尝试重用以下文档中的代码: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 玉莲欧法
解决方法
我遇到的第一个问题是 缓存缓存 = CacheFactory.getAnyInstance(); 不应在构造函数中执行。如果是,则代码在客户端实例中执行,它因非服务器错误而失败。修复后我收到
在服务器端注册 Function
后,您可以通过 ID
执行它,而不是通过网络发送对象(因此您不需要在客户端实例化该函数),在这种情况下,您还可以避免 Serialization filter
错误。例如,FunctionService.onServers(instance).execute(CreateRegionFunction.ID)
。
问题是代码在 dunit MemberVM 上执行,所需的类实际上是执行测试的包的一部分。所以我想我应该以某种方式将这些类(或者可能是 jar )分别注册到 dunit MemberVM。怎么做?
确实,出于安全原因,Geode
不允许序列化/反序列化任意类。内部 Geode
分布式测试使用 MemberVM
并设置特殊属性 (serializable-object-filter
) 来规避此问题。 Here's 一个示例,说明如何在自己的测试中实现这一目标。
另一个问题是:当前代码正在检查该区域是否存在,如果不存在则调用该方法。在这两种情况下,它还会尝试创建 clientRegion。问题是这是否是一种正确的方法?
如果动态创建的区域被客户端应用程序使用,那么是的,您应该创建它,否则您将无法使用它。
顺便提一下,在创建 Geode
时,Region
实现了很多内部逻辑,因此我不建议您自己动态创建区域。相反,建议直接使用 gfsh create region
命令,或查看其内部工作原理(请参阅 here)并尝试重新使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。