Для некоторых key
карта все еще имеет устаревшее значение. Новое обновление не отображается для нескольких ключей. Эта ошибка относится к категории not reproducible
.
Код:
class DemoCache{
private ConcurrentHashMap<String,Demo> demoByName = new ConcurrentHashMap<String,Demo>();
private ConcurrentHashMap<String,Demo> demoByID = new ConcurrentHashMap<String,Demo>();
public initializeFromDB(){
log.info(me + "Initializing/refresh instrument from database.");
DemoDbDynamo demoDbDynamo = new DemoDbDynamo();
final AtomicInteger progressCounter = new AtomicInteger();
try
{
demoDbDynamo.listAll()
.stream()
.peek(i -> progressCounter.incrementAndGet())
.forEach(this::updateCache);
}
catch (Exception e)
{
log.error(me + "Exception fetching demo cache from table. " + e );
}
log.info(me + "count: " + progressCounter.get());
}
}
public void updateCache(Demo demo){
Demo existing = demoByID.get(demo.getID());
demoByID.put( dmeo.getID(), demo );
// this is an updated existing demo
if(existing != null) {
//if name have changed
demoByName.remove(existing.getName());
}
demoByName.put ( demo.getName(), demo );
//logging new value -- demo.getName and demo.getValue
//logging old value - demo.getName and demo.getValue
}
}
Размер карты: 6k
Вся операция является однопоточной. JMS topi c попадает в этот класс для инициализации карты из БД. У нас есть 4 разных сервера, и на каждом сервере есть этот локальный кеш, который получил refre sh от JMS Topi c msg. Из 4 серверов 3 обновляются со всеми правильными значениями, а 1 сервер все еще сохраняет устаревшие значения для нескольких ключей.
Что может быть причиной root этой проблемы?
обновлений результатов из комментария:
Журналы:
JMS msg
ip-10-0-33-185 20:15:40.374 [ThreadName=ActiveMQ Session Task-72] DEBUG cache.DemoCache {} -- DemoCache.onMessage() : [msg=<response mt='5099'/>]
ip-10-0-33-185 20:15:40.375 [ThreadName=ActiveMQ Session Task-72] INFO cache.DemoCache {} -- DemoCache.initializeFromDB(): Initializing/refresh cache from database.
ip-10-0-33-185 20:15:45.897 [ThreadName=ActiveMQ Session Task-72] DEBUG cache.DemoCache {} --
[newObject=[NewID=06926627-e950-48f3-9c53-b679f61120ec newName=foo,newValue=2640.98]]
[OldObject=[oldName=foo,oldValue=2641.05]]
ip-10-0-33-185 20:15:45.913 [ActiveMQ Session Task-72] INFO cache.DemoCache {} -- DemoCache.initializeFromDB(): count: 5362
Здесь _collector = ip-10-0-33-185
, то есть серверный узел. Этот сервер возвращает старое значение = 2641,05 вместо нового значения. Выполняется только один поток ActiveMQ Session Task-72
. Других обсуждений не вижу.