1

我正在运行基于Infinispan单元测试之一的简单测试用例。在我的测试中,我希望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 资源。同步不允许在它们的afterCompletion()方法中抛出 XAExceptions,并且事务管理器(包括DummyTransactionManagerLookup)吞下任何运行时异常。

在乐观模式下,键和值在 期间被复制 beforeCompletion(),允许抛出异常以取消事务。

在悲观模式下,您应该将 Infinispan 配置为注册为 XA 资源:

   configuration.transaction().useSynchronization(false);

编辑:默认情况下,DummyTransactionManager不支持 XA 事务,因此您还需要为 XA 配置它(甚至更好,使用 Narayana):

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