成功订阅区域并设置CacheListener并完成使用后,Region. GetSubscriptionService()中的
UnsterKeys()
方法。取消注册键(新列表
如何正确取消订阅该地区?
我正在使用Apache Geode Native 1.10.0运行它。NETWPF框架4.6.0
图片1-获得感兴趣的密钥:
图像2-执行取消注册密钥并再次检查感兴趣的密钥。
创建缓存工厂:
cacheFactory.Set("log-file", _serviceName + "Geode.log")
.Set("log-level", "info")
.Set("statistic-sampling-enabled", "false")
.Set("name", _serviceName)
.SetPdxReadSerialized(true)
.Create();
创建池:
_cache.GetPoolManager()
.CreateFactory()
.SetSubscriptionEnabled(true)
.AddLocator(_host, _port)
.SetFreeConnectionTimeout(new TimeSpan(5000))
.Create();
仍在为此进行重现,但可以肯定地说,这似乎不是C从最新开发分支与Geode Native对话的问题。以下测试代码通过:
auto cache = createTestCache();
auto poolFactory =
cache.getPoolManager().createFactory().setSubscriptionEnabled(true);
cluster.applyLocators(poolFactory);
poolFactory.create("default");
auto region = setupCachingProxyRegion(cache);
std::vector<std::shared_ptr<CacheableKey> > keys;
keys.push_back(std::make_shared<CacheableInt32>(123456));
region->registerKeys(keys, false, true);
auto attrMutator = region->getAttributesMutator();
auto listener = std::make_shared<SimpleCacheListioner>();
attrMutator->setCacheListener(listener);
region->put(123456, "foo");
region->put(123456, "bar");
region->put(123456, "baz");
region->put(123456, "qux");
region->unregisterKeys(keys);
auto stillInterested = region->getInterestList();
EXPECT_EQ(stillInterested.size(), 0);
EXPECT_EQ(listener->getCreateCount(), 1);
EXPECT_EQ(listener->getUpdateCount(), 3);
EXPECT_EQ(listener->getInvalidateCount(), 0);
EXPECT_EQ(listener->getDestroyCount(), 0);
cache.close();
理论上,C#/. net Geode Native客户端只是以最小的更改包装C代码,因此语言在这里不应该是一个问题,但当然,在我尝试之前我不会知道。同样,自1.10.0下降以来,我不记得这部分代码发生了任何更改,但在我尝试之前我也不会知道,所以回滚到该提交并重新运行测试也在我的待办事项列表中。当/如果我了解更多信息时,我会在这里提供更新。
我认为在这种情况下,测试本身存在问题。
问题在于假设CacheListener是订阅的一部分,但实际上它只与区域相关联,任何本地或远程事件都可以触发CacheListener。要确定事件源,用户必须通过RemoteOrigin方法检查EntryEvent的来源,作为Cachelistener事件处理的一部分。在密钥中使用注册兴趣是服务器端事件,因此取消注册密钥的兴趣也是服务器端操作,它应该停止从服务器向客户端推送事件,但仍会为本地事件触发CacheListener。如果您希望侦听器不再触发,则必须通过区域属性突变器将其设置为空。