JBoss кеш.Проблема параллелизма - PullRequest
1 голос
/ 14 ноября 2011

Я использую 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 ]

2 голосов
/ 16 ноября 2011

Ваш код выглядит нормально, поэтому, возможно, кэш Jboss асинхронный. Я не вижу в Javadocs ничего, что гарантировало бы, когда кэш будет обновлен.

Я знаю, что во многих реализациях распределенного кэша операция put записывается на провод, и даже локальный экземпляр кэша обновляется из входящего сообщения, а не напрямую через локальный вызов. Это позволяет кэшам соответствующим образом сериализовать свои обновления, чтобы обновления с нескольких компьютеров обрабатывались в правильном порядке на всех узлах в сети.

Следует попробовать установить кэш-память на МЕСТНЫЙ. Примерно так:

Configuration config = new Configuration();
config.setCacheMode(LOCAL);
Cache cache = new DefaultCacheFactory().createCache(config, false);
...

Если это не так, то я подозреваю, что я прав. Даже если он все равно не работает, я могу быть прав, поскольку в режимах LOCAL все еще может быть петлевой сетевой стек или что-то в этом роде.

Надеюсь, это поможет.

1 голос
/ 16 ноября 2011

Обновление кеша 3.2.5 решило эту проблему. Похоже, это ошибка кеша jboss .

...