diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java index fe90bb87c08..d1befb40902 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java @@ -61,6 +61,9 @@ class JmsAnnotationDrivenConfiguration { if (this.transactionManager != null) { factory.setTransactionManager(this.transactionManager); } + else { + factory.setSessionTransacted(true); + } if (this.destinationResolver != null) { factory.setDestinationResolver(this.destinationResolver); } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java index 64481f176ac..66cc254ddf5 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java @@ -23,12 +23,14 @@ import org.apache.activemq.pool.PooledConnectionFactory; import org.junit.After; import org.junit.Test; import org.springframework.beans.BeansException; +import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration; import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerConfigUtils; @@ -38,10 +40,13 @@ import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.DefaultMessageListenerContainer; +import org.springframework.transaction.jta.JtaTransactionManager; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -137,6 +142,48 @@ public class JmsAutoConfigurationTests { jmsListenerContainerFactory.getClass()); } + @Test + public void testDefaultContainerFactoryWithJtaTransactionManager() { + this.context = createContext(TestConfiguration7.class, + EnableJmsConfiguration.class); + JmsListenerContainerFactory jmsListenerContainerFactory = this.context + .getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class); + assertEquals(DefaultJmsListenerContainerFactory.class, + jmsListenerContainerFactory.getClass()); + DefaultMessageListenerContainer listenerContainer = ((DefaultJmsListenerContainerFactory) + jmsListenerContainerFactory).createListenerContainer(mock(JmsListenerEndpoint.class)); + assertFalse("wrong session transacted flag with JTA transactions", listenerContainer.isSessionTransacted()); + assertSame(this.context.getBean(JtaTransactionManager.class), + new DirectFieldAccessor(listenerContainer).getPropertyValue("transactionManager")); + } + + @Test + public void testDefaultContainerFactoryNonJtaTransactionManager() { + this.context = createContext(TestConfiguration8.class, + EnableJmsConfiguration.class); + JmsListenerContainerFactory jmsListenerContainerFactory = this.context + .getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class); + assertEquals(DefaultJmsListenerContainerFactory.class, + jmsListenerContainerFactory.getClass()); + DefaultMessageListenerContainer listenerContainer = ((DefaultJmsListenerContainerFactory) + jmsListenerContainerFactory).createListenerContainer(mock(JmsListenerEndpoint.class)); + assertTrue("wrong session transacted flag with no tx manager", listenerContainer.isSessionTransacted()); + assertNull(new DirectFieldAccessor(listenerContainer).getPropertyValue("transactionManager")); + } + + @Test + public void testDefaultContainerFactoryNoTransactionManager() { + this.context = createContext(EnableJmsConfiguration.class); + JmsListenerContainerFactory jmsListenerContainerFactory = this.context + .getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class); + assertEquals(DefaultJmsListenerContainerFactory.class, + jmsListenerContainerFactory.getClass()); + DefaultMessageListenerContainer listenerContainer = ((DefaultJmsListenerContainerFactory) + jmsListenerContainerFactory).createListenerContainer(mock(JmsListenerEndpoint.class)); + assertTrue("wrong session transacted flag with no tx manager", listenerContainer.isSessionTransacted()); + assertNull(new DirectFieldAccessor(listenerContainer).getPropertyValue("transactionManager")); + } + @Test public void testPubSubDisabledByDefault() { load(TestConfiguration.class); @@ -350,6 +397,26 @@ public class JmsAutoConfigurationTests { } + @Configuration + protected static class TestConfiguration7 { + + @Bean + JtaTransactionManager transactionManager() { + return mock(JtaTransactionManager.class); + } + + } + + @Configuration + protected static class TestConfiguration8 { + + @Bean + DataSourceTransactionManager transactionManager() { + return mock(DataSourceTransactionManager.class); + } + + } + @Configuration @EnableJms protected static class EnableJmsConfiguration {