提问者:小点点

未在Apache Geode本机客户端中执行的UnsterKeys()方法


成功订阅区域并设置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();

共2个答案

匿名用户

仍在为此进行重现,但可以肯定地说,这似乎不是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。如果您希望侦听器不再触发,则必须通过区域属性突变器将其设置为空。