Geode region [key] get触发器区域监听器创建事件

时间:2018-04-16 13:36:43

标签: gemfire geode

使用Geode 1.2和9.1 Pivotal本机客户端,代码如下:

IRegion<string, IPdxInstance> r = cache.GetRegion<string, IPdxInstance>("myRegion");
return r[key];

然后触发AfterCreate的{​​{1}}事件。为什么在没有创建数据时才会发生这种情况,只读?

2 个答案:

答案 0 :(得分:1)

我从未使用过Native Client,但乍一看,应该预期在客户端调用afterCreate事件,因为条目实际上是正在创建本地缓存。我的意思是该条目可能存在于服务器上,但在内部,客户端需要从服务器检索它,然后在本地创建它(从而为本地安装的afterCreate调用CacheListener) 。有道理吗?。

答案 1 :(得分:1)

在这里,从未使用过Native Client。我同意@Urizen所怀疑的内容 - 你从没有该条目的Geode实例调用r[key],因此它从其他实例中提取数据,这些实例在本地“创建”该条目。

你有几个选择:

  1. 使用registerAllKeys()(文档here)为您正在发起呼叫的实例执行兴趣注册。这里有一个问题:(可能不适用于本机客户端),在Java API中,您可以选择使用InterestResultPolicy注册兴趣。如果使用KEYS_VALUES,则会在启动时从远程将所有数据加载到本地,而不会触发afterCreate回调。如果您只选择KEYS或NONE,您可能会遇到类似的问题。

  2. 您可以在remoteOrigin中检查布尔标记EntryEvent。如果它是假的,它纯粹是本地的。在非WAN设置中,这应该足以区分本地操作和远程启动的操作(无论是缓存同步还是由其他缓存启动的真正创建)。模糊地记住WAN在这里工作有点不同。