1

Infinispanユニット テストの 1 つに基づいて、簡単なテスト ケースを実行しています。私のテストCacheExceptionでは、クラスターでレプリケーションがタイムアウトしたときに受信することを期待しています。

私はペシミスティックなトランザクション ロックを使用していますが、この場合、何らかの理由で例外がスローされません。悲観的ロックにコメントすると、予想どおり例外が発生します。

@Test(groups = "functional", testName = "replication.ReplicationExceptionTest")
public class ReplicationExceptionTest extends MultipleCacheManagersTest {

    protected void createCacheManagers() {
        ConfigurationBuilder configuration = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, true);
        configuration.locking()
                .lockAcquisitionTimeout(60000l)
                .transaction().transactionManagerLookup(new DummyTransactionManagerLookup());
                // uncomment this line and exception is not thrown for some reason
                //.lockingMode(LockingMode.PESSIMISTIC);
        createClusteredCaches(2, configuration);
        waitForClusterToForm();
    }

    @Test(groups = "functional", expectedExceptions = { CacheException.class })
    public void testSyncReplTimeout() {
        AdvancedCache cache1 = cache(0).getAdvancedCache();
        AdvancedCache cache2 = cache(1).getAdvancedCache();
        cache2.addInterceptor(new CommandInterceptor() {
            @Override
            protected Object handleDefault(InvocationContext ctx, VisitableCommand cmd)
                    throws Throwable {
                // Add a delay
                Thread.sleep(100);
                return super.handleDefault(ctx, cmd);
            }
        }, 0);

        cache1.getCacheConfiguration().clustering().sync().replTimeout(10);
        cache2.getCacheConfiguration().clustering().sync().replTimeout(10);
        TestingUtil.blockUntilViewsReceived(10000, cache1, cache2);

        cache1.put("k", "v");
    }

}

悲観的ロックを有効にして例外を隠している理由とそれを修正する方法を誰かが理解するのを手伝ってくれますか?

更新: Infinispan 5.3.0.Final を使用しています。

4

1 に答える 1

3

これは、Infinispan が、完全な XA リソースではなく、デフォルトで「同期」として自身をトランザクション マネージャーに登録するためです。同期では、メソッドで XAExceptions をスローすることは許可されておらずafterCompletion()、トランザクション マネージャー (を含むDummyTransactionManagerLookup) はランタイム例外をすべて飲み込みます。

オプティミスティック モードでは、キーと値が実行中 beforeCompletion()に複製され、トランザクションをキャンセルするために例外をスローすることが許可されます。

ペシミスティック モードでは、代わりに XA リソースとして登録するように Infinispan を構成する必要があります。

   configuration.transaction().useSynchronization(false);

編集: デフォルトでDummyTransactionManagerは、XA トランザクションをサポートしていないため、XA 用に構成する必要もあります (または、Narayana を使用することをお勧めします)。

    DummyTransactionManager.getInstance().setUseXaXid(true);
于 2014-03-27T07:13:19.100 に答える