INT-2777 TxSynchFactory: tests for bound resource

This commit is contained in:
Artem Bilan
2012-10-15 16:08:11 +03:00
committed by Oleg Zhurakousky
parent 7fcb5cbb45
commit 4dfbcf9777

View File

@@ -18,6 +18,9 @@ package org.springframework.integration.endpoint;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -30,9 +33,11 @@ import org.springframework.integration.transaction.DefaultTransactionSynchroniza
import org.springframework.integration.transaction.ExpressionEvaluatingTransactionSynchronizationProcessor;
import org.springframework.integration.transaction.PseudoTransactionManager;
import org.springframework.integration.transaction.IntegrationResourceHolder;
import org.springframework.integration.transaction.TransactionSynchronizationFactory;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionSynchronizationUtils;
import org.springframework.transaction.support.TransactionTemplate;
@@ -40,6 +45,7 @@ import org.springframework.transaction.support.TransactionTemplate;
/**
* @author Gary Russell
* @author Oleg Zhurakousky
* @author Artem Bilan
* @since 2.2
*
*/
@@ -253,6 +259,75 @@ public class PseudoTransactionalMessageSourceTests {
assertEquals("qux", rollbackMessage.getPayload());
}
@Test
public void testInt2777UnboundResourceAfterTransactionComplete() {
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
adapter.setSource(new MessageSource<String>() {
public Message<String> receive() {
return null;
}
});
TransactionSynchronizationManager.setActualTransactionActive(true);
adapter.doPoll();
TransactionSynchronizationManager.setActualTransactionActive(false);
// Before INT-2777 this test was failed here
TransactionSynchronizationManager.setActualTransactionActive(true);
adapter.doPoll();
TransactionSynchronizationManager.setActualTransactionActive(false);
}
@Ignore
@Test
public void testInt2777CustomTransactionSynchronizationFactoryWithoutDealWithIntegrationResourceHolder() {
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
final AtomicInteger txSyncCounter = new AtomicInteger();
TransactionSynchronizationFactory syncFactory = new TransactionSynchronizationFactory() {
public TransactionSynchronization create(Object key) {
return new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
txSyncCounter.incrementAndGet();
}
};
}
};
adapter.setTransactionSynchronizationFactory(syncFactory);
adapter.setSource(new MessageSource<String>() {
public Message<String> receive() {
return null;
}
});
TransactionSynchronizationManager.initSynchronization();
TransactionSynchronizationManager.setActualTransactionActive(true);
adapter.doPoll();
TransactionSynchronizationUtils.triggerAfterCompletion(TransactionSynchronization.STATUS_COMMITTED);
TransactionSynchronizationManager.clearSynchronization();
TransactionSynchronizationManager.setActualTransactionActive(false);
assertEquals(1, txSyncCounter.get());
/*TODO: Failed with 'java.lang.IllegalStateException: Already value
TODO: [org.springframework.integration.transaction.IntegrationResourceHolder@46b8c8e6]
TODO: for key [org.springframework.integration.endpoint.PseudoTransactionalMessageSourceTests$8@78a1d1f4] bound to thread [main]'*/
//TODO: Need new JIRA issue to fix it
TransactionSynchronizationManager.initSynchronization();
TransactionSynchronizationManager.setActualTransactionActive(true);
adapter.doPoll();
TransactionSynchronizationUtils.triggerAfterCompletion(TransactionSynchronization.STATUS_COMMITTED);
TransactionSynchronizationManager.clearSynchronization();
TransactionSynchronizationManager.setActualTransactionActive(false);
assertEquals(2, txSyncCounter.get());
}
public class Bar {
public String getValue() {
return "bar";