diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java index 1390e7acd1f..1654fd78725 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java @@ -16,7 +16,6 @@ package org.springframework.boot.autoconfigure.jms.activemq; -import java.util.List; import java.util.stream.Collectors; import javax.jms.ConnectionFactory; @@ -49,43 +48,42 @@ import org.springframework.jms.connection.CachingConnectionFactory; class ActiveMQConnectionFactoryConfiguration { @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(CachingConnectionFactory.class) @ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "false", matchIfMissing = true) static class SimpleConnectionFactoryConfiguration { - private final ActiveMQProperties properties; - - private final List connectionFactoryCustomizers; - - SimpleConnectionFactoryConfiguration(ActiveMQProperties properties, - ObjectProvider connectionFactoryCustomizers) { - this.properties = properties; - this.connectionFactoryCustomizers = connectionFactoryCustomizers.orderedStream() - .collect(Collectors.toList()); - } - - @Bean - @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true", - matchIfMissing = true) - CachingConnectionFactory cachingJmsConnectionFactory(JmsProperties jmsProperties) { - JmsProperties.Cache cacheProperties = jmsProperties.getCache(); - CachingConnectionFactory connectionFactory = new CachingConnectionFactory(createConnectionFactory()); - connectionFactory.setCacheConsumers(cacheProperties.isConsumers()); - connectionFactory.setCacheProducers(cacheProperties.isProducers()); - connectionFactory.setSessionCacheSize(cacheProperties.getSessionCacheSize()); - return connectionFactory; - } - @Bean @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "false") - ActiveMQConnectionFactory jmsConnectionFactory() { - return createConnectionFactory(); + ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties, + ObjectProvider factoryCustomizers) { + return new ActiveMQConnectionFactoryFactory(properties, + factoryCustomizers.orderedStream().collect(Collectors.toList())) + .createConnectionFactory(ActiveMQConnectionFactory.class); } - private ActiveMQConnectionFactory createConnectionFactory() { - return new ActiveMQConnectionFactoryFactory(this.properties, this.connectionFactoryCustomizers) - .createConnectionFactory(ActiveMQConnectionFactory.class); + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(CachingConnectionFactory.class) + @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true", + matchIfMissing = true) + static class CachingConnectionFactoryConfiguration { + + @Bean + @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true", + matchIfMissing = true) + CachingConnectionFactory cachingJmsConnectionFactory(JmsProperties jmsProperties, + ActiveMQProperties properties, + ObjectProvider factoryCustomizers) { + JmsProperties.Cache cacheProperties = jmsProperties.getCache(); + CachingConnectionFactory connectionFactory = new CachingConnectionFactory( + new ActiveMQConnectionFactoryFactory(properties, + factoryCustomizers.orderedStream().collect(Collectors.toList())) + .createConnectionFactory(ActiveMQConnectionFactory.class)); + connectionFactory.setCacheConsumers(cacheProperties.isConsumers()); + connectionFactory.setCacheProducers(cacheProperties.isProducers()); + connectionFactory.setSessionCacheSize(cacheProperties.getSessionCacheSize()); + return connectionFactory; + } + } } @@ -95,8 +93,7 @@ class ActiveMQConnectionFactoryConfiguration { static class PooledConnectionFactoryConfiguration { @Bean(destroyMethod = "stop") - @ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "true", - matchIfMissing = false) + @ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "true") JmsPoolConnectionFactory pooledJmsConnectionFactory(ActiveMQProperties properties, ObjectProvider factoryCustomizers) { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory(properties, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java index 81a013905d6..a66dafbc690 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQAutoConfigurationTests.java @@ -24,6 +24,7 @@ import org.messaginghub.pooled.jms.JmsPoolConnectionFactory; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -189,6 +190,20 @@ class ActiveMQAutoConfigurationTests { }); } + @Test + void cachingConnectionFactoryNotOnTheClasspathThenSimpleConnectionFactoryAutoConfigured() { + this.contextRunner.withClassLoader(new FilteredClassLoader(CachingConnectionFactory.class)) + .withPropertyValues("spring.activemq.pool.enabled=false", "spring.jms.cache.enabled=false") + .run((context) -> assertThat(context).hasSingleBean(ActiveMQConnectionFactory.class)); + } + + @Test + void cachingConnectionFactoryNotOnTheClasspathAndCacheEnabledThenSimpleConnectionFactoryNotConfigured() { + this.contextRunner.withClassLoader(new FilteredClassLoader(CachingConnectionFactory.class)) + .withPropertyValues("spring.activemq.pool.enabled=false", "spring.jms.cache.enabled=true") + .run((context) -> assertThat(context).doesNotHaveBean(ActiveMQConnectionFactory.class)); + } + @Configuration(proxyBeanMethods = false) static class EmptyConfiguration {