2014-03-26 1 views
1

Я запускаю простой тестовый пример на основе одного из Infinispan модульных тестов. В моем тесте я ожидаю получить CacheException при таймаутах репликации в моем кластере.Ключ Infinispan не генерирует исключение в пессимистичном режиме

Я использую пессимистическую блокировку транзакции, и исключение в этом случае не возникает по какой-либо причине. Если я комментирую пессимистическую блокировку, я получаю исключение, как ожидалось.

@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.

ответ

2

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

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

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

configuration.transaction().useSynchronization(false); 

Edit: По умолчанию DummyTransactionManager не поддерживает XA транзакций, так что вы также должны настроить его для XA (или даже лучше, используйте Нараяну):

DummyTransactionManager.getInstance().setUseXaXid(true); 
+0

Это действительно полезно, я бы никогда не понял эту комбинацию. большое спасибо – hoaz