Commit d0896859 authored by Stephane Nicoll's avatar Stephane Nicoll

Add auto configuration for Spring 4.1 JMS features

This commit adds two additional auto-configuration items that are new
in Spring 4.1

* A JmsMessagingTemplate is automatically created if none is present
* A default JmsListenerContainerFactory is automatically created if
  @EnableJms has been triggered and no default has been set manually

Fixes gh-1298
parent 6217c1b0
...@@ -29,12 +29,17 @@ import org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfigurati ...@@ -29,12 +29,17 @@ import org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfigurati
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.jms.annotation.EnableJms;
import org.springframework.jms.annotation.JmsListenerAnnotationBeanPostProcessor;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.JmsTemplate;
/** /**
* {@link EnableAutoConfiguration Auto-configuration} for Spring JMS. * {@link EnableAutoConfiguration Auto-configuration} for Spring JMS.
* *
* @author Greg Turnquist * @author Greg Turnquist
* @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnClass(JmsTemplate.class) @ConditionalOnClass(JmsTemplate.class)
...@@ -57,4 +62,29 @@ public class JmsAutoConfiguration { ...@@ -57,4 +62,29 @@ public class JmsAutoConfiguration {
return jmsTemplate; return jmsTemplate;
} }
@ConditionalOnClass(JmsMessagingTemplate.class)
@ConditionalOnMissingBean(JmsMessagingTemplate.class)
protected static class MessagingTemplateConfiguration {
@Bean
public JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
return new JmsMessagingTemplate(jmsTemplate);
}
}
@ConditionalOnClass(EnableJms.class)
@ConditionalOnBean(JmsListenerAnnotationBeanPostProcessor.class)
protected static class AnnotationDrivenConfiguration {
@ConditionalOnMissingBean(name = "jmsListenerContainerFactory")
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
} }
...@@ -29,6 +29,11 @@ import org.springframework.boot.test.EnvironmentTestUtils; ...@@ -29,6 +29,11 @@ import org.springframework.boot.test.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
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.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.JmsTemplate;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
...@@ -46,40 +51,69 @@ public class JmsAutoConfigurationTests { ...@@ -46,40 +51,69 @@ public class JmsAutoConfigurationTests {
private AnnotationConfigApplicationContext context; private AnnotationConfigApplicationContext context;
@Test @Test
public void testDefaultJmsTemplate() { public void testDefaultJmsConfiguration() {
load(TestConfiguration.class); load(TestConfiguration.class);
JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class);
ActiveMQConnectionFactory connectionFactory = this.context ActiveMQConnectionFactory connectionFactory = this.context
.getBean(ActiveMQConnectionFactory.class); .getBean(ActiveMQConnectionFactory.class);
assertNotNull(jmsTemplate); JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class);
assertNotNull(connectionFactory); JmsMessagingTemplate messagingTemplate = this.context.getBean(JmsMessagingTemplate.class);
assertEquals(jmsTemplate.getConnectionFactory(), connectionFactory); assertEquals(jmsTemplate.getConnectionFactory(), connectionFactory);
assertEquals(jmsTemplate, messagingTemplate.getJmsTemplate());
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",
context.containsBean("jmsListenerContainerFactory"));
} }
@Test @Test
public void testConnectionFactoryBackoff() { public void testConnectionFactoryBackOff() {
load(TestConfiguration2.class); load(TestConfiguration2.class);
assertEquals("foobar", this.context.getBean(ActiveMQConnectionFactory.class) assertEquals("foobar", this.context.getBean(ActiveMQConnectionFactory.class)
.getBrokerURL()); .getBrokerURL());
} }
@Test @Test
public void testJmsTemplateBackoff() { public void testJmsTemplateBackOff() {
load(TestConfiguration3.class); load(TestConfiguration3.class);
JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class); JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class);
assertEquals(999, jmsTemplate.getPriority()); assertEquals(999, jmsTemplate.getPriority());
} }
@Test @Test
public void testJmsTemplateBackoffEverything() { public void testJmsMessagingTemplateBackOff() {
this.context = createContext(TestConfiguration2.class, TestConfiguration3.class); load(TestConfiguration5.class);
JmsMessagingTemplate messagingTemplate = this.context.getBean(JmsMessagingTemplate.class);
assertEquals("fooBar", messagingTemplate.getDefaultDestinationName());
}
@Test
public void testJmsTemplateBackOffEverything() {
this.context = createContext(TestConfiguration2.class, TestConfiguration3.class, TestConfiguration5.class);
JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class); JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class);
assertEquals(999, jmsTemplate.getPriority()); assertEquals(999, jmsTemplate.getPriority());
assertEquals("foobar", this.context.getBean(ActiveMQConnectionFactory.class) assertEquals("foobar", this.context.getBean(ActiveMQConnectionFactory.class)
.getBrokerURL()); .getBrokerURL());
JmsMessagingTemplate messagingTemplate = this.context.getBean(JmsMessagingTemplate.class);
assertEquals("fooBar", messagingTemplate.getDefaultDestinationName());
assertEquals(jmsTemplate, messagingTemplate.getJmsTemplate());
}
@Test
public void testEnableJmsCreateDefaultContainerFactory() {
load(EnableJmsConfiguration.class);
JmsListenerContainerFactory<?> jmsListenerContainerFactory =
this.context.getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class);
assertEquals(DefaultJmsListenerContainerFactory.class, jmsListenerContainerFactory.getClass());
}
@Test
public void testJmsListenerContainerFactoryBackOff() {
this.context = createContext(TestConfiguration6.class, EnableJmsConfiguration.class);
JmsListenerContainerFactory<?> jmsListenerContainerFactory =
this.context.getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class);
assertEquals(SimpleJmsListenerContainerFactory.class, jmsListenerContainerFactory.getClass());
} }
@Test @Test
...@@ -97,7 +131,7 @@ public class JmsAutoConfigurationTests { ...@@ -97,7 +131,7 @@ public class JmsAutoConfigurationTests {
} }
@Test @Test
public void testJmsTemplateOverridden() { public void testPubSubDomainOverride() {
load(TestConfiguration.class, "spring.jms.pubSubDomain:false"); load(TestConfiguration.class, "spring.jms.pubSubDomain:false");
JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class); JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class);
ActiveMQConnectionFactory connectionFactory = this.context ActiveMQConnectionFactory connectionFactory = this.context
...@@ -245,4 +279,33 @@ public class JmsAutoConfigurationTests { ...@@ -245,4 +279,33 @@ public class JmsAutoConfigurationTests {
return bean; return bean;
} }
} }
@Configuration
protected static class TestConfiguration5 {
@Bean
JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);
messagingTemplate.setDefaultDestinationName("fooBar");
return messagingTemplate;
}
}
@Configuration
protected static class TestConfiguration6 {
@Bean
JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
@Configuration
@EnableJms
protected static class EnableJmsConfiguration {
}
} }
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