Так я недавно столкнулись с ошибкой при использовании 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