2017-02-10 7 views
0

Так я недавно столкнулись с ошибкой при использовании Ignite, что сводило меня с ума, чтобы понять и думал, что этот пост может помочь некоторым потерянную душу там, так что здесь идет:Bug, используя карту в качестве ключа кэша в Ignite

Сценарий заключается в следующем: у меня есть класс A, который имеет только поле java.util.Map, которое я использую в качестве ключа кеша воспламенения для сопоставления некоторого значения.

У меня 2 экземпляров одного и того же сервиса: S1 & S2, каждое из которых работает узел воспламеняют. Обратимся к воспламенить узлов экземпляров в качестве узлов N и M

Обе службы делают affinityCalls на загораются, поэтому любой экземпляр службы используется, вызов воспламеняться будет идти в том же узле.

Сценарий, который происходит следующим образом: 1. Service S1, делает вызов сродства на N и сохраняет в кэше N «s отображение -> Значение V 2 Служба S2 выполняет тот же аффинный вызов и переходит к N. Однако при попытке получить значение, которое было помещено в кеш-память N, к шагу 1 он не может получить его, как если бы кеш не " t содержать его.

Для того, чтобы прояснить ситуацию, рассмотрим следующий псевдокод:

S1 выполняет следующие действия в Шаг 1.

IgniteCache igniteCache = ....;

Карта map1 = новая Карта(); map1.put («некоторый ключ», «некоторое значение»);

A cacheKey = new A (Карта);

igniteCache.put (keyInCache, что угодно);

S2 выполняет следующие действия в Шаг 2

IgniteCache igniteCache = ....;

Карта map2 = новая Карта(); map2.put («некоторый ключ», «некоторое значение»);

keyToRetrieve = новый (map2);

igniteCache.contains (keyToRetrive) -> false.

, хотя keyToRetrieve.equals (cacheKey) является истинным.

и кэш действительно содержит cacheKey.

Виновником этого вопроса, как я нашел, что это было использование Карта как поле в ключе типа . Как кажется воспламенить имеют проблемы с делом с ключами, которые имеют член Карты, а также упомянутые здесь:

Ignite cache.containsKey returns false although keys are equal

ответ

0

ответ:

использовать что-то другое, чем карты в качестве ключа. Я использовал целое число, а затем все проблемы исчезли.

Я подозреваю, что это может быть связано с тем, как карты проверяются, чтобы быть равными за кулисами в Ignite.

3

Использование Map в качестве ключа кэш очень не типично. Я бы не рекомендовал это делать. Если ключ представляет собой составной объект с несколькими полями, и нет класса, его можно построить с помощью двоичного построителя: https://apacheignite.readme.io/docs/binary-marshaller#modifying-binary-objects-using-binaryobjectbuilder

 Смежные вопросы

  • Нет связанных вопросов^_^