JBoss缓存。并发问题

时间:2011-11-14 17:01:55

标签: java jboss jboss-cache

我正在使用 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运行失败。 3次运行中的1次返回“错误”消息。它只是返回null。我无法在每台机器上重现它。

有任何线索吗?

2 个答案:

答案 0 :(得分:2)

您的代码看起来很好,因此可能是Jboss缓存是异步的。我在Javadocs中看不到什么可以保证缓存何时更新。

我知道在许多分布式缓存实现中,put操作被写入线路,甚至缓存的本地实例也从入站消息更新,而不是直接通过本地调用。这允许缓存适当地序列化其更新,以便在网络中的所有节点上以正确的顺序处理来自多台计算机的更新。

要尝试的一件事是将缓存设置为LOCAL。如下所示:

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

如果没有失败那么我怀疑我是对的。即使它仍然失败,我可能是正确的,因为LOCAL模式下面可能仍然有一个环回网络堆栈。

希望这有帮助。

答案 1 :(得分:1)

更新到缓存3.2.5解决了这个问题。好像是 jboss cache bug