Метод UnregisterKeys () не выполняется в собственном клиенте geode apache - PullRequest
1 голос
/ 30 января 2020

После успешной подписки на регион и настройки CacheListener и завершения его использования метод UnregisterKeys() в
Region.GetSubscriptionService().UnregisterKeys(new List<string>() { key }), похоже, не работает, как показано на скриншотах. После выполнения кода ниже события по-прежнему запускаются в AfterUpdate(EntryEvent<TKey, TVal> ev).

Как правильно отписаться от региона?

Я использую Apache Geode Native 1.10.0, на котором он запущен. NET WPF Framework 4.6.0

Изображение 1 - Интересующийся Ключи:

enter image description here

Изображение 2 - Выполнение UnregisterKeys и проверка на наличие Снова заинтересованные ключи.

enter image description here

Создание CacheFactory:

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 ]

1 голос
/ 01 февраля 2020

Все еще работаем над репро для этого, но могу сказать наверняка, что это не проблема с 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 просто упаковывает код C ++ с минимальными изменениями, поэтому язык не должен быть проблемой здесь, но, конечно, я не буду знать, пока я не попробую. Кроме того, я не помню никаких изменений, которые были внесены в эту часть кода с момента удаления 1.10.0, но опять же я не буду знать, пока я не попробую, так что откат к этому коммиту и повторный запуск теста также включены мой список дел. Когда / если я узнаю больше, я предоставлю обновление здесь.

0 голосов
/ 08 апреля 2020

Я думаю, что в этом случае есть проблема с самим тестом.

Проблема заключается в предположении, что CacheListener является частью подписки, но на самом деле он просто связан с регионом, и любое событие, локальное или удаленное, может вызвать CacheListener. Чтобы определить источник события, пользователь должен проверить EntryEvent на предмет происхождения через метод RemoteOrigin как часть обработки события Cachelistener. Использование интереса регистра в ключе является событием на стороне сервера, поэтому незарегистрированный интерес к ключу также является действием на стороне сервера, которое должно остановить pu sh событий от сервера к клиенту, но CacheListener все равно будет запущен для местное событие. Если вы хотите, чтобы слушатель больше не запускал, тогда он должен быть установлен в нуль через регион AttributesMutator.

...