diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TestTransactionManager.java b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TestTransactionManager.java index 4032773161..dcae0b1269 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TestTransactionManager.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TestTransactionManager.java @@ -38,6 +38,8 @@ public class TestTransactionManager extends AbstractPlatformTransactionManager { private final CountDownLatch latch = new CountDownLatch(1); + private volatile TransactionDefinition lastDefinition; + public int getCommitCount() { return this.commitCounter.get(); @@ -47,12 +49,17 @@ public class TestTransactionManager extends AbstractPlatformTransactionManager { return this.rollbackCounter.get(); } + public TransactionDefinition getLastDefinition() { + return this.lastDefinition; + } + public void waitForCompletion(long timeout) throws InterruptedException { this.latch.await(timeout, TimeUnit.MILLISECONDS); } @Override protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException { + this.lastDefinition = definition; } @Override diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TransactionInterceptorTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TransactionInterceptorTests.java index 08dbdb3254..9621ccf5b0 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TransactionInterceptorTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/TransactionInterceptorTests.java @@ -24,8 +24,14 @@ import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.channel.MessageChannel; +import org.springframework.integration.endpoint.MessageEndpoint; import org.springframework.integration.message.Message; import org.springframework.integration.message.StringMessage; +import org.springframework.transaction.IllegalTransactionStateException; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; /** * @author Mark Fisher @@ -66,4 +72,94 @@ public class TransactionInterceptorTests { assertEquals(1, txManager.getRollbackCount()); } + @Test + public void testPropagationRequired() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "transactionInterceptorPropagationTests.xml", this.getClass()); + TestTransactionManager txManager = (TestTransactionManager) context.getBean("txManager"); + final MessageEndpoint endpoint = (MessageEndpoint) context.getBean("required"); + assertEquals(0, txManager.getCommitCount()); + endpoint.invoke(new StringMessage("test")); + assertEquals(1, txManager.getCommitCount()); + TestTransactionManager outerTxManager = new TestTransactionManager(); + TransactionTemplate txTemplate = new TransactionTemplate(outerTxManager); + txTemplate.execute(new TransactionCallback() { + public Object doInTransaction(TransactionStatus status) { + return endpoint.invoke(new StringMessage("test")); + } + }); + assertEquals(1, outerTxManager.getCommitCount()); + assertEquals(2, txManager.getCommitCount()); + assertEquals(Propagation.REQUIRED.value(), txManager.getLastDefinition().getPropagationBehavior()); + } + + @Test + public void testPropagationRequiresNew() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "transactionInterceptorPropagationTests.xml", this.getClass()); + TestTransactionManager txManager = (TestTransactionManager) context.getBean("txManager"); + final MessageEndpoint endpoint = (MessageEndpoint) context.getBean("requiresNew"); + assertEquals(0, txManager.getCommitCount()); + endpoint.invoke(new StringMessage("test")); + assertEquals(1, txManager.getCommitCount()); + TestTransactionManager outerTxManager = new TestTransactionManager(); + TransactionTemplate txTemplate = new TransactionTemplate(outerTxManager); + txTemplate.execute(new TransactionCallback() { + public Object doInTransaction(TransactionStatus status) { + return endpoint.invoke(new StringMessage("test")); + } + }); + assertEquals(1, outerTxManager.getCommitCount()); + assertEquals(2, txManager.getCommitCount()); + assertEquals(Propagation.REQUIRES_NEW.value(), txManager.getLastDefinition().getPropagationBehavior()); + } + + @Test + public void testPropagationSupports() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "transactionInterceptorPropagationTests.xml", this.getClass()); + TestTransactionManager txManager = (TestTransactionManager) context.getBean("txManager"); + final MessageEndpoint endpoint = (MessageEndpoint) context.getBean("supports"); + assertEquals(0, txManager.getCommitCount()); + endpoint.invoke(new StringMessage("test")); + assertEquals(0, txManager.getCommitCount()); + TestTransactionManager outerTxManager = new TestTransactionManager(); + TransactionTemplate txTemplate = new TransactionTemplate(outerTxManager); + txTemplate.execute(new TransactionCallback() { + public Object doInTransaction(TransactionStatus status) { + return endpoint.invoke(new StringMessage("test")); + } + }); + assertEquals(0, txManager.getCommitCount()); + assertEquals(1, outerTxManager.getCommitCount()); + } + + @Test + public void testPropagationNotSupported() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "transactionInterceptorPropagationTests.xml", this.getClass()); + TestTransactionManager txManager = (TestTransactionManager) context.getBean("txManager"); + final MessageEndpoint endpoint = (MessageEndpoint) context.getBean("notSupported"); + assertEquals(0, txManager.getCommitCount()); + endpoint.invoke(new StringMessage("test")); + assertEquals(0, txManager.getCommitCount()); + TestTransactionManager outerTxManager = new TestTransactionManager(); + TransactionTemplate txTemplate = new TransactionTemplate(outerTxManager); + txTemplate.execute(new TransactionCallback() { + public Object doInTransaction(TransactionStatus status) { + return endpoint.invoke(new StringMessage("test")); + } + }); + assertEquals(0, txManager.getCommitCount()); + assertEquals(1, outerTxManager.getCommitCount()); + } + + @Test(expected = IllegalTransactionStateException.class) + public void testPropagationMandatoryCalledWithoutTransaction() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "transactionInterceptorPropagationTests.xml", this.getClass()); + final MessageEndpoint endpoint = (MessageEndpoint) context.getBean("mandatory"); + endpoint.invoke(new StringMessage("test")); + } + } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/transactionInterceptorPropagationTests.xml b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/transactionInterceptorPropagationTests.xml new file mode 100644 index 0000000000..d59e8184d4 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/endpoint/interceptor/transactionInterceptorPropagationTests.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +