diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java index 8d11ef28ea7..4127760398e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java @@ -16,18 +16,16 @@ package org.springframework.boot.autoconfigure.jms.activemq; -import java.lang.reflect.Method; - import javax.jms.ConnectionFactory; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.pool.PooledConnectionFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.util.Assert; -import org.springframework.util.ReflectionUtils; /** * Configuration for ActiveMQ {@link ConnectionFactory}. @@ -43,31 +41,24 @@ import org.springframework.util.ReflectionUtils; class ActiveMQConnectionFactoryConfiguration { @Bean - public ConnectionFactory jmsConnectionFactory(ActiveMQProperties properties) { - ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory( - properties).createConnectionFactory(ActiveMQConnectionFactory.class); - if (properties.isPooled()) { - PooledConnectionFactory pool = new PooledConnectionFactory(); - Method setConnectionFactory = findConnectionFactorySetter(); - Assert.state(setConnectionFactory != null, - "No supported " + "setConnectionFactory method was found"); - ReflectionUtils.invokeMethod(setConnectionFactory, pool, connectionFactory); - return pool; - } - return connectionFactory; + @ConditionalOnProperty(prefix = "spring.activemq", name = "pooled", havingValue = "false", matchIfMissing = true) + public ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties) { + return new ActiveMQConnectionFactoryFactory(properties) + .createConnectionFactory(ActiveMQConnectionFactory.class); } - private Method findConnectionFactorySetter() { - Method setter = findConnectionFactorySetter(ConnectionFactory.class); - if (setter == null) { - setter = findConnectionFactorySetter(Object.class); - } - return setter; - } + @ConditionalOnClass(PooledConnectionFactory.class) + static class PooledConnectionFactoryConfiguration { + + @Bean(destroyMethod = "stop") + @ConditionalOnProperty(prefix = "spring.activemq", name = "pooled", havingValue = "true", matchIfMissing = false) + public PooledConnectionFactory pooledJmsConnectionFactory( + ActiveMQProperties properties) { + return new PooledConnectionFactory( + new ActiveMQConnectionFactoryFactory(properties) + .createConnectionFactory(ActiveMQConnectionFactory.class)); + } - private Method findConnectionFactorySetter(Class param) { - return ReflectionUtils.findMethod(PooledConnectionFactory.class, - "setConnectionFactory", param); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQXAConnectionFactoryConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQXAConnectionFactoryConfiguration.java index 7d09cea018c..7a67555fd12 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQXAConnectionFactoryConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQXAConnectionFactoryConfiguration.java @@ -26,6 +26,7 @@ import org.apache.activemq.pool.PooledConnectionFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.jta.XAConnectionFactoryWrapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -53,15 +54,25 @@ class ActiveMQXAConnectionFactoryConfiguration { } @Bean - public ConnectionFactory nonXaJmsConnectionFactory(ActiveMQProperties properties) { - ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory( - properties).createConnectionFactory(ActiveMQConnectionFactory.class); - if (properties.isPooled()) { - PooledConnectionFactory pool = new PooledConnectionFactory(); - pool.setConnectionFactory(connectionFactory); - return pool; + @ConditionalOnProperty(prefix = "spring.activemq", name = "pooled", havingValue = "false", matchIfMissing = true) + public ActiveMQConnectionFactory nonXaJmsConnectionFactory( + ActiveMQProperties properties) { + return new ActiveMQConnectionFactoryFactory(properties) + .createConnectionFactory(ActiveMQConnectionFactory.class); + } + + @ConditionalOnClass(PooledConnectionFactory.class) + @ConditionalOnProperty(prefix = "spring.activemq", name = "pooled", havingValue = "true", matchIfMissing = false) + static class PooledConnectionFactoryConfiguration { + + @Bean(destroyMethod = "stop") + public PooledConnectionFactory pooledNonXaJmsConnectionFactory( + ActiveMQProperties properties) { + return new PooledConnectionFactory( + new ActiveMQConnectionFactoryFactory(properties) + .createConnectionFactory(ActiveMQConnectionFactory.class)); } - return connectionFactory; + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java index d293694812e..8a39424b9e7 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jms.activemq; import javax.jms.ConnectionFactory; +import javax.jms.JMSException; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.pool.PooledConnectionFactory; @@ -29,6 +30,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -62,11 +65,14 @@ public class ActiveMQAutoConfigurationTests { } @Test - public void pooledConnectionFactoryConfiguration() { + public void pooledConnectionFactoryConfiguration() throws JMSException { load(EmptyConfiguration.class, "spring.activemq.pooled:true"); ConnectionFactory connectionFactory = this.context .getBean(ConnectionFactory.class); assertThat(connectionFactory, instanceOf(PooledConnectionFactory.class)); + this.context.close(); + assertThat(((PooledConnectionFactory) connectionFactory).createConnection(), + is(nullValue())); } private void load(Class config, String... environment) {