JBoss кеш. Проблема параллелизма
Я использую JBossCache 'Malagueta' 3.2.0.GA
Я столкнулся со странной проблемой в производственной среде, иногда записи в кэш jboss не работают должным образом. Я пытался воспроизвести эту ситуацию с помощью простого приложения Java
public static void testCache() {
Cache cache = new DefaultCacheFactory().createCache(false);
cache.create();
cache.start();
final Node node = cache.getRoot().addChild(Fqn.fromString("/child1"));
int threadsCount = 20;
final CyclicBarrier b = new CyclicBarrier(threadsCount);
for (int i = 0; i < threadsCount; i++) {
final long j = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
b.await();
String name = RandomGenerator.getRandomName(4);
node.put(j, name);
String nameFromCache = (String) node.get(j);
if (!name.equals(nameFromCache)) {
System.out.println("error");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
Время от времени этот тест выводит "ошибку", из которой я запускаю static void main
потерпеть поражение. 1 из 3 прогонов возвращает сообщение об ошибке Это просто возвращает ноль. Я не могу воспроизвести это на каждой машине.
Любая подсказка?
2 ответа
Обновление кеша 3.2.5 решило эту проблему. Похоже, это ошибка кеша jboss.
Ваш код выглядит нормально, поэтому, возможно, кеш Jboss асинхронный. Я не вижу ничего в Javadocs, который гарантировал бы, когда кеш будет обновлен.
Я знаю, что во многих реализациях распределенного кэша put
операция записывается на провод, и даже локальный экземпляр кэша обновляется из входящего сообщения, а не напрямую через локальный вызов. Это позволяет кэшам соответствующим образом сериализовать свои обновления, чтобы обновления с нескольких компьютеров обрабатывались в правильном порядке на всех узлах в сети.
Одна вещь, чтобы попытаться состоит в том, чтобы установить кэш как ЛОКАЛЬНЫЙ. Что-то вроде следующего:
Configuration config = new Configuration();
config.setCacheMode(LOCAL);
Cache cache = new DefaultCacheFactory().createCache(config, false);
...
Если это не подводит, то я подозреваю, что я прав. Даже если это все еще терпит неудачу, я могу быть прав, так как LOCAL
режимы могут все еще иметь петлевой сетевой стек или что-то в этом роде.
Надеюсь это поможет.