1

我正在使用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。我无法在每台机器上重现它。

有什么线索吗?

4

2 回答 2

2

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

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

要尝试的一件事是将缓存设置为本地。类似于以下内容:

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

如果那没有失败,那么我怀疑我是正确的。即使它仍然失败,我也可能是正确的,因为这些LOCAL模式下可能仍然有一个环回网络堆栈或其他东西。

希望这可以帮助。

于 2011-11-15T22:17:41.117 回答
1

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

于 2011-11-16T10:38:36.570 回答