diff --git a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd index 44829fb030..ecf7553937 100644 --- a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd +++ b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/config/spring-integration-adapters-1.0.xsd @@ -92,6 +92,7 @@ + diff --git a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/JmsGateway.java b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/JmsGateway.java index 460836fea8..5faf15068a 100644 --- a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/JmsGateway.java +++ b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/JmsGateway.java @@ -30,6 +30,7 @@ import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.listener.adapter.MessageListenerAdapter; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter; +import org.springframework.transaction.PlatformTransactionManager; import org.springframework.util.Assert; /** @@ -51,6 +52,8 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis private volatile TaskExecutor taskExecutor; + private volatile PlatformTransactionManager transactionManager; + private volatile boolean sessionTransacted; private volatile int sessionAcknowledgeMode = Session.AUTO_ACKNOWLEDGE; @@ -91,6 +94,10 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis this.taskExecutor = taskExecutor; } + public void setTransactionManager(PlatformTransactionManager transactionManager) { + this.transactionManager = transactionManager; + } + public void setSessionTransacted(boolean sessionTransacted) { this.sessionTransacted = sessionTransacted; } @@ -134,6 +141,7 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis if (this.destinationName != null) { dmlc.setDestinationName(this.destinationName); } + dmlc.setTransactionManager(this.transactionManager); dmlc.setSessionTransacted(this.sessionTransacted); dmlc.setSessionAcknowledgeMode(this.sessionAcknowledgeMode); dmlc.setAutoStartup(false); diff --git a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/config/JmsGatewayParser.java b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/config/JmsGatewayParser.java index 3f925490d0..46284419bd 100644 --- a/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/config/JmsGatewayParser.java +++ b/org.springframework.integration.adapter/src/main/java/org/springframework/integration/adapter/jms/config/JmsGatewayParser.java @@ -86,6 +86,10 @@ public class JmsGatewayParser extends AbstractSingleBeanDefinitionParser { builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode); } } + String transactionManager = element.getAttribute("transaction-manager"); + if (StringUtils.hasText(transactionManager)) { + builder.addPropertyReference("transactionManager", transactionManager); + } String requestChannel = element.getAttribute("request-channel"); if (StringUtils.hasText(requestChannel)) { builder.addPropertyReference("requestChannel", requestChannel); diff --git a/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/JmsGatewayParserTests.java b/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/JmsGatewayParserTests.java index 21565b63d9..8af87b66ce 100644 --- a/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/JmsGatewayParserTests.java +++ b/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/JmsGatewayParserTests.java @@ -18,6 +18,7 @@ package org.springframework.integration.adapter.jms.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import org.junit.Test; @@ -29,6 +30,7 @@ import org.springframework.integration.adapter.jms.JmsGateway; import org.springframework.integration.channel.MessageChannel; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.message.Message; +import org.springframework.jms.connection.JmsTransactionManager; /** * @author Mark Fisher @@ -140,4 +142,25 @@ public class JmsGatewayParserTests { context.stop(); } + @Test + public void testTransactionManagerIsNullByDefault() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsGatewayTransactionManagerTests.xml", this.getClass()); + JmsGateway gateway = (JmsGateway) context.getBean("gatewayWithoutTransactionManager"); + DirectFieldAccessor accessor = new DirectFieldAccessor(gateway); + assertNull(accessor.getPropertyValue("transactionManager")); + } + + @Test + public void testGatewayWithTransactionManagerReference() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsGatewayTransactionManagerTests.xml", this.getClass()); + JmsGateway gateway = (JmsGateway) context.getBean("gatewayWithTransactionManager"); + DirectFieldAccessor accessor = new DirectFieldAccessor(gateway); + Object txManager = accessor.getPropertyValue("transactionManager"); + assertEquals(JmsTransactionManager.class, txManager.getClass()); + assertEquals(context.getBean("txManager"), txManager); + assertEquals(context.getBean("testConnectionFactory"), ((JmsTransactionManager) txManager).getConnectionFactory()); + } + } diff --git a/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/jmsGatewayTransactionManagerTests.xml b/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/jmsGatewayTransactionManagerTests.xml new file mode 100644 index 0000000000..dabe2ee604 --- /dev/null +++ b/org.springframework.integration.adapter/src/test/java/org/springframework/integration/adapter/jms/config/jmsGatewayTransactionManagerTests.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + +