Кэш Infinispan не генерирует исключение в пессимистическом режиме

Я запускаю простой тестовый пример на основе одного из модульных тестов 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.


person hoaz    schedule 26.03.2014    source источник


Ответы (1)


Это связано с тем, что Infinispan по умолчанию регистрируется в диспетчере транзакций как «синхронизация», а не как полный ресурс XA. Синхронизации не разрешено генерировать исключения XAException в своих afterCompletion() методах, а менеджеры транзакций (включая DummyTransactionManagerLookup) проглатывают любые исключения во время выполнения.

В оптимистичном режиме ключи и значения реплицируются во время beforeCompletion(), что позволяет генерировать исключение для отмены транзакции.

В пессимистическом режиме следует настроить Infinispan для регистрации в качестве ресурса XA:

   configuration.transaction().useSynchronization(false);

Редактировать: по умолчанию DummyTransactionManager не поддерживает транзакции XA, поэтому вам также необходимо настроить его для XA (или, что еще лучше, использовать Narayana):

    DummyTransactionManager.getInstance().setUseXaXid(true);
person Dan Berindei    schedule 27.03.2014
comment
Это действительно полезно, я бы никогда не понял эту комбинацию. Большое спасибо - person hoaz; 27.03.2014