Configure ActiveMQConnectionFactory properly without spring-jms

Previously, if spring-jms is not available and a non-pool connection
factory is requested (the default), no `CachingConnectionFactory` is
created. This commit makes sure to separate the two conditions, so
that a connection factory can be obtained even if spring-jms is not
on the classpath.

See gh-36767
pull/37210/head
Eddú Meléndez 1 year ago committed by Stephane Nicoll
parent 5ed5820f92
commit bcfaad2cb8

@ -44,41 +44,40 @@ import org.springframework.jms.connection.CachingConnectionFactory;
class ArtemisConnectionFactoryConfiguration { class ArtemisConnectionFactoryConfiguration {
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(CachingConnectionFactory.class)
@ConditionalOnProperty(prefix = "spring.artemis.pool", name = "enabled", havingValue = "false", @ConditionalOnProperty(prefix = "spring.artemis.pool", name = "enabled", havingValue = "false",
matchIfMissing = true) matchIfMissing = true)
static class SimpleConnectionFactoryConfiguration { static class SimpleConnectionFactoryConfiguration {
private final ArtemisProperties properties; @Bean(name = "jmsConnectionFactory")
@ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "false")
private final ListableBeanFactory beanFactory; ActiveMQConnectionFactory jmsConnectionFactory(ArtemisProperties properties, ListableBeanFactory beanFactory) {
return createConnectionFactory(properties, beanFactory);
}
SimpleConnectionFactoryConfiguration(ArtemisProperties properties, ListableBeanFactory beanFactory) { private static ActiveMQConnectionFactory createConnectionFactory(ArtemisProperties properties,
this.properties = properties; ListableBeanFactory beanFactory) {
this.beanFactory = beanFactory; return new ArtemisConnectionFactoryFactory(beanFactory, properties)
.createConnectionFactory(ActiveMQConnectionFactory.class);
} }
@Bean(name = "jmsConnectionFactory") @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(CachingConnectionFactory.class)
@ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true", @ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "true",
matchIfMissing = true) matchIfMissing = true)
CachingConnectionFactory cachingJmsConnectionFactory(JmsProperties jmsProperties) { static class CachingConnectionFactoryConfiguration {
@Bean(name = "jmsConnectionFactory")
CachingConnectionFactory cachingJmsConnectionFactory(JmsProperties jmsProperties,
ArtemisProperties properties, ListableBeanFactory beanFactory) {
JmsProperties.Cache cacheProperties = jmsProperties.getCache(); JmsProperties.Cache cacheProperties = jmsProperties.getCache();
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(createConnectionFactory()); CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
createConnectionFactory(properties, beanFactory));
connectionFactory.setCacheConsumers(cacheProperties.isConsumers()); connectionFactory.setCacheConsumers(cacheProperties.isConsumers());
connectionFactory.setCacheProducers(cacheProperties.isProducers()); connectionFactory.setCacheProducers(cacheProperties.isProducers());
connectionFactory.setSessionCacheSize(cacheProperties.getSessionCacheSize()); connectionFactory.setSessionCacheSize(cacheProperties.getSessionCacheSize());
return connectionFactory; return connectionFactory;
} }
@Bean(name = "jmsConnectionFactory")
@ConditionalOnProperty(prefix = "spring.jms.cache", name = "enabled", havingValue = "false")
ActiveMQConnectionFactory jmsConnectionFactory() {
return createConnectionFactory();
}
private ActiveMQConnectionFactory createConnectionFactory() {
return new ArtemisConnectionFactoryFactory(this.beanFactory, this.properties)
.createConnectionFactory(ActiveMQConnectionFactory.class);
} }
} }

@ -47,6 +47,7 @@ import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration; import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -357,6 +358,20 @@ class ArtemisAutoConfigurationTests {
}); });
} }
@Test
void cachingConnectionFactoryNotOnTheClasspathThenSimpleConnectionFactoryAutoConfigured() {
this.contextRunner.withClassLoader(new FilteredClassLoader(CachingConnectionFactory.class))
.withPropertyValues("spring.artemis.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.artemis.pool.enabled=false", "spring.jms.cache.enabled=true")
.run((context) -> assertThat(context).doesNotHaveBean(ActiveMQConnectionFactory.class));
}
private ConnectionFactory getConnectionFactory(AssertableApplicationContext context) { private ConnectionFactory getConnectionFactory(AssertableApplicationContext context) {
assertThat(context).hasSingleBean(ConnectionFactory.class).hasBean("jmsConnectionFactory"); assertThat(context).hasSingleBean(ConnectionFactory.class).hasBean("jmsConnectionFactory");
ConnectionFactory connectionFactory = context.getBean(ConnectionFactory.class); ConnectionFactory connectionFactory = context.getBean(ConnectionFactory.class);

Loading…
Cancel
Save