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多くの分散キャッシュの実装では、操作がネットワークに書き出され、キャッシュのローカルインスタンスでさえ、ローカル呼び出しを介して直接ではなく、インバウンドメッセージから更新されることを知っています。これにより、キャッシュは更新を適切にシリアル化できるため、複数のマシンからの更新がネットワーク内のすべてのノードで正しい順序で処理されます。

試してみる1つのことは、キャッシュをLOCALに設定することです。次のようなもの:

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 に答える