Commit b3ce079e authored by Phillip Webb's avatar Phillip Webb

Automatically apply @EnableJMS

Automatically apply @EnableJMS when spring-jms is on the classpath
and the annotation hasn't already been applied. This allow for Spring's
new @JmsListener annotation to just work.

Fixes gh-1425
parent a4925dab
...@@ -19,14 +19,15 @@ package org.springframework.boot.autoconfigure.jms; ...@@ -19,14 +19,15 @@ package org.springframework.boot.autoconfigure.jms;
import javax.jms.ConnectionFactory; import javax.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.annotation.JmsListenerAnnotationBeanPostProcessor; import org.springframework.jms.annotation.JmsBootstrapConfiguration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerConfigUtils;
import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
...@@ -39,7 +40,7 @@ import org.springframework.transaction.PlatformTransactionManager; ...@@ -39,7 +40,7 @@ import org.springframework.transaction.PlatformTransactionManager;
*/ */
@Configuration @Configuration
@ConditionalOnClass(EnableJms.class) @ConditionalOnClass(EnableJms.class)
@ConditionalOnBean(JmsListenerAnnotationBeanPostProcessor.class) @Import(JmsBootstrapConfiguration.class)
class JmsAnnotationDrivenConfiguration { class JmsAnnotationDrivenConfiguration {
@Autowired(required = false) @Autowired(required = false)
...@@ -63,4 +64,10 @@ class JmsAnnotationDrivenConfiguration { ...@@ -63,4 +64,10 @@ class JmsAnnotationDrivenConfiguration {
return factory; return factory;
} }
@EnableJms
@ConditionalOnMissingBean(name = JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
protected static class EnableJmsConfiguration {
}
} }
...@@ -31,6 +31,7 @@ import org.springframework.context.annotation.Bean; ...@@ -31,6 +31,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerConfigUtils;
import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.jms.core.JmsMessagingTemplate;
...@@ -63,7 +64,7 @@ public class JmsAutoConfigurationTests { ...@@ -63,7 +64,7 @@ public class JmsAutoConfigurationTests {
assertEquals(ActiveMQProperties.DEFAULT_EMBEDDED_BROKER_URL, assertEquals(ActiveMQProperties.DEFAULT_EMBEDDED_BROKER_URL,
((ActiveMQConnectionFactory) jmsTemplate.getConnectionFactory()) ((ActiveMQConnectionFactory) jmsTemplate.getConnectionFactory())
.getBrokerURL()); .getBrokerURL());
assertFalse("No listener container factory should be created by default", assertTrue("listener container factory should be created by default",
this.context.containsBean("jmsListenerContainerFactory")); this.context.containsBean("jmsListenerContainerFactory"));
} }
...@@ -110,7 +111,6 @@ public class JmsAutoConfigurationTests { ...@@ -110,7 +111,6 @@ public class JmsAutoConfigurationTests {
.getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class); .getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class);
assertEquals(DefaultJmsListenerContainerFactory.class, assertEquals(DefaultJmsListenerContainerFactory.class,
jmsListenerContainerFactory.getClass()); jmsListenerContainerFactory.getClass());
} }
@Test @Test
...@@ -223,6 +223,14 @@ public class JmsAutoConfigurationTests { ...@@ -223,6 +223,14 @@ public class JmsAutoConfigurationTests {
assertEquals("tcp://remote-host:10000", factory.getBrokerURL()); assertEquals("tcp://remote-host:10000", factory.getBrokerURL());
} }
@Test
public void enableJmsAutomatically() throws Exception {
load(NoEnableJmsConfiguration.class);
AnnotationConfigApplicationContext ctx = this.context;
ctx.getBean(JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME);
ctx.getBean(JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME);
}
private AnnotationConfigApplicationContext createContext( private AnnotationConfigApplicationContext createContext(
Class<?>... additionalClasses) { Class<?>... additionalClasses) {
return doLoad(additionalClasses); return doLoad(additionalClasses);
...@@ -291,6 +299,7 @@ public class JmsAutoConfigurationTests { ...@@ -291,6 +299,7 @@ public class JmsAutoConfigurationTests {
@Configuration @Configuration
protected static class TestConfiguration5 { protected static class TestConfiguration5 {
@Bean @Bean
JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) { JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate); JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);
...@@ -302,6 +311,7 @@ public class JmsAutoConfigurationTests { ...@@ -302,6 +311,7 @@ public class JmsAutoConfigurationTests {
@Configuration @Configuration
protected static class TestConfiguration6 { protected static class TestConfiguration6 {
@Bean @Bean
JmsListenerContainerFactory<?> jmsListenerContainerFactory( JmsListenerContainerFactory<?> jmsListenerContainerFactory(
ConnectionFactory connectionFactory) { ConnectionFactory connectionFactory) {
...@@ -317,4 +327,8 @@ public class JmsAutoConfigurationTests { ...@@ -317,4 +327,8 @@ public class JmsAutoConfigurationTests {
protected static class EnableJmsConfiguration { protected static class EnableJmsConfiguration {
} }
@Configuration
protected static class NoEnableJmsConfiguration {
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment