diff --git a/spring-jms/src/main/java/org/springframework/jms/annotation/EnableJms.java b/spring-jms/src/main/java/org/springframework/jms/annotation/EnableJms.java index d8782b2b031..f60fbbd42c4 100644 --- a/spring-jms/src/main/java/org/springframework/jms/annotation/EnableJms.java +++ b/spring-jms/src/main/java/org/springframework/jms/annotation/EnableJms.java @@ -66,7 +66,9 @@ import org.springframework.context.annotation.Import; * } * * The container factory to use is identified by the {@link JmsListener#containerFactory() containerFactory} - * attribute defining the name of the {@code JmsListenerContainerFactory} bean to use. + * attribute defining the name of the {@code JmsListenerContainerFactory} bean to use. When none + * is set a {@code JmsListenerContainerFactory} bean with name {@code jmsListenerContainerFactory} is + * assumed to be present. * *

the following configuration would ensure that every time a {@link javax.jms.Message} * is received on the {@link javax.jms.Destination} named "myQueue", {@code MyService.process()} @@ -118,9 +120,8 @@ import org.springframework.context.annotation.Import; *

When more control is desired, a {@code @Configuration} class may implement * {@link JmsListenerConfigurer}. This allows access to the underlying * {@link org.springframework.jms.config.JmsListenerEndpointRegistrar JmsListenerEndpointRegistrar} - * instance. The following example demonstrates how to specify a default - * {@code JmsListenerContainerFactory} so that {@link JmsListener#containerFactory()} may be - * omitted for endpoints willing to use the default container factory. + * instance. The following example demonstrates how to specify an explicit default + * {@code JmsListenerContainerFactory} * *

  * @Configuration
@@ -128,7 +129,7 @@ import org.springframework.context.annotation.Import;
  * public class AppConfig implements JmsListenerConfigurer {
  *     @Override
  *     public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
- *         registrar.setDefaultContainerFactory(myJmsListenerContainerFactory());
+ *         registrar.setContainerFactory(myJmsListenerContainerFactory());
  *     }
  *
  *     @Bean
@@ -146,7 +147,7 @@ import org.springframework.context.annotation.Import;
  * configuration:
  * 
  * {@code 
- *     
+ *     
  *
  *     
diff --git a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java
index 2294ea090e6..02a4aa692f0 100644
--- a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java
+++ b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListener.java
@@ -28,8 +28,10 @@ import org.springframework.messaging.handler.annotation.MessageMapping;
  * Annotation that marks a method to be the target of a JMS message
  * listener on the specified {@link #destination()}. The {@link #containerFactory()}
  * identifies the {@link org.springframework.jms.config.JmsListenerContainerFactory
- * JmsListenerContainerFactory} to use to build the jms listener container. It may
- * be omitted as long as a default container factory has been defined.
+ * JmsListenerContainerFactory} to use to build the jms listener container. If not
+ * set, a default container factory is assumed to be available with a bean
+ * name of {@code jmsListenerContainerFactory} unless an explicit default has been
+ * provided through configuration.
  *
  * 

Processing of {@code @JmsListener} annotations is performed by * registering a {@link JmsListenerAnnotationBeanPostProcessor}. This can be diff --git a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java index 784a5762fdc..a3157722686 100644 --- a/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java +++ b/spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java @@ -73,13 +73,18 @@ import org.springframework.util.StringUtils; public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor, Ordered, ApplicationContextAware, ApplicationListener { + /** + * The bean name of the default {@link JmsListenerContainerFactory} + */ + static final String DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME = "jmsListenerContainerFactory"; + private final AtomicInteger counter = new AtomicInteger(); private ApplicationContext applicationContext; private JmsListenerEndpointRegistry endpointRegistry; - private JmsListenerContainerFactory defaultContainerFactory; + private String containerFactoryBeanName = DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME; private final JmsHandlerMethodFactoryAdapter jmsHandlerMethodFactory = new JmsHandlerMethodFactoryAdapter(); @@ -99,12 +104,12 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor } /** - * Set the default {@link JmsListenerContainerFactory} to use in case a - * {@link JmsListener} does not define any. - * {@linkplain JmsListener#containerFactory() containerFactory} + * Set the name of the {@link JmsListenerContainerFactory} to use by default. + *

If none is specified, {@value #DEFAULT_JMS_LISTENER_CONTAINER_FACTORY_BEAN_NAME} + * is assumed to be defined. */ - public void setDefaultContainerFactory(JmsListenerContainerFactory defaultContainerFactory) { - this.defaultContainerFactory = defaultContainerFactory; + public void setContainerFactoryBeanName(String containerFactoryBeanName) { + this.containerFactoryBeanName = containerFactoryBeanName; } /** @@ -209,6 +214,9 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor for (JmsListenerConfigurer configurer : instances.values()) { configurer.configureJmsListeners(registrar); } + + registrar.setApplicationContext(this.applicationContext); + if (registrar.getEndpointRegistry() == null) { if (endpointRegistry == null) { endpointRegistry = applicationContext @@ -217,10 +225,13 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor } registrar.setEndpointRegistry(endpointRegistry); } - if (registrar.getDefaultContainerFactory() == null && defaultContainerFactory != null) { - registrar.setDefaultContainerFactory(defaultContainerFactory); + + if (this.containerFactoryBeanName != null) { + registrar.setContainerFactoryBeanName(this.containerFactoryBeanName); } + + // Set the custom handler method factory once resolved by the configurer JmsHandlerMethodFactory handlerMethodFactory = registrar.getJmsHandlerMethodFactory(); if (handlerMethodFactory != null) { this.jmsHandlerMethodFactory.setJmsHandlerMethodFactory(handlerMethodFactory); @@ -235,7 +246,6 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor } } - private String getEndpointId(JmsListener jmsListener) { if (StringUtils.hasText(jmsListener.id())) { return jmsListener.id(); @@ -267,7 +277,7 @@ public class JmsListenerAnnotationBeanPostProcessor implements BeanPostProcessor private JmsHandlerMethodFactory getJmsHandlerMethodFactory() { if (jmsHandlerMethodFactory == null) { - jmsHandlerMethodFactory= createDefaultJmsHandlerMethodFactory(); + jmsHandlerMethodFactory = createDefaultJmsHandlerMethodFactory(); } return jmsHandlerMethodFactory; } diff --git a/spring-jms/src/main/java/org/springframework/jms/config/AnnotationDrivenJmsBeanDefinitionParser.java b/spring-jms/src/main/java/org/springframework/jms/config/AnnotationDrivenJmsBeanDefinitionParser.java index b4322abd7bf..10c95094f03 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/AnnotationDrivenJmsBeanDefinitionParser.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/AnnotationDrivenJmsBeanDefinitionParser.java @@ -64,10 +64,12 @@ final class AnnotationDrivenJmsBeanDefinitionParser implements BeanDefinitionPar else { registerDefaultEndpointRegistry(source, parserContext); } - String defaultContainerFactory = element.getAttribute("default-container-factory"); - if (StringUtils.hasText(defaultContainerFactory)) { - builder.addPropertyReference("defaultContainerFactory", defaultContainerFactory); + + String containerFactory = element.getAttribute("container-factory"); + if (StringUtils.hasText(containerFactory)) { + builder.addPropertyValue("containerFactoryBeanName", containerFactory); } + String handlerMethodFactory = element.getAttribute("handler-method-factory"); if (StringUtils.hasText(handlerMethodFactory)) { builder.addPropertyReference("jmsHandlerMethodFactory", handlerMethodFactory); diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java index e14ff415960..73e0f964cd3 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.util.Assert; /** @@ -30,14 +32,18 @@ import org.springframework.util.Assert; * @since 4.1 * @see org.springframework.jms.annotation.JmsListenerConfigurer */ -public class JmsListenerEndpointRegistrar implements InitializingBean { +public class JmsListenerEndpointRegistrar implements ApplicationContextAware, InitializingBean { private JmsListenerEndpointRegistry endpointRegistry; - private JmsListenerContainerFactory defaultContainerFactory; + private String containerFactoryBeanName; + + private JmsListenerContainerFactory containerFactory; private JmsHandlerMethodFactory jmsHandlerMethodFactory; + private ApplicationContext applicationContext; + private final List endpointDescriptors = new ArrayList(); @@ -57,20 +63,24 @@ public class JmsListenerEndpointRegistrar implements InitializingBean { } /** - * Set the default {@link JmsListenerContainerFactory} to use in case a - * {@link JmsListenerEndpoint} is registered with a {@code null} container - * factory. + * Set the bean name of the {@link JmsListenerContainerFactory} to use in + * case a {@link JmsListenerEndpoint} is registered with a {@code null} + * container factory. Alternatively, the container factory instance can + * be registered directly, see {@link #setContainerFactory(JmsListenerContainerFactory)} */ - public void setDefaultContainerFactory(JmsListenerContainerFactory defaultContainerFactory) { - this.defaultContainerFactory = defaultContainerFactory; + public void setContainerFactoryBeanName(String containerFactoryBeanName) { + this.containerFactoryBeanName = containerFactoryBeanName; } /** - * Return the {@link JmsListenerContainerFactory} to use if none has been - * defined for a particular endpoint or {@code null} if no default is set. + * Set the {@link JmsListenerContainerFactory} to use in case a + * {@link JmsListenerEndpoint} is registered with a {@code null} container + * factory. + *

Alternatively, the bean name of the {@link JmsListenerContainerFactory} + * to use can be specified for a lazy lookup, see {@see #setContainerFactoryBeanName} */ - public JmsListenerContainerFactory getDefaultContainerFactory() { - return defaultContainerFactory; + public void setContainerFactory(JmsListenerContainerFactory containerFactory) { + this.containerFactory = containerFactory; } /** @@ -92,6 +102,11 @@ public class JmsListenerEndpointRegistrar implements InitializingBean { return jmsHandlerMethodFactory; } + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + /** * Register a new {@link JmsListenerEndpoint} alongside the {@link JmsListenerContainerFactory} * to use to create the underlying container. @@ -109,7 +124,7 @@ public class JmsListenerEndpointRegistrar implements InitializingBean { * Register a new {@link JmsListenerEndpoint} using the default {@link JmsListenerContainerFactory} * to create the underlying container. * - * @see #setDefaultContainerFactory(JmsListenerContainerFactory) + * @see #setContainerFactory(JmsListenerContainerFactory) * @see #registerEndpoint(JmsListenerEndpoint, JmsListenerContainerFactory) */ public void registerEndpoint(JmsListenerEndpoint endpoint) { @@ -118,6 +133,7 @@ public class JmsListenerEndpointRegistrar implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { + Assert.notNull(applicationContext, "ApplicationContext must not be null"); startAllEndpoints(); } @@ -132,8 +148,13 @@ public class JmsListenerEndpointRegistrar implements InitializingBean { if (descriptor.containerFactory != null) { return descriptor.containerFactory; } - else if (defaultContainerFactory != null) { - return defaultContainerFactory; + else if (this.containerFactory != null) { + return this.containerFactory; + } + else if (this.containerFactoryBeanName != null) { + this.containerFactory = applicationContext.getBean( + this.containerFactoryBeanName, JmsListenerContainerFactory.class); + return this.containerFactory; // Consider changing this if live change of the factory is required } else { throw new IllegalStateException("Could not resolve the " diff --git a/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms-4.1.xsd b/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms-4.1.xsd index 582cd48ca66..740da217f3e 100644 --- a/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms-4.1.xsd +++ b/spring-jms/src/main/resources/org/springframework/jms/config/spring-jms-4.1.xsd @@ -43,13 +43,15 @@ - + diff --git a/spring-jms/src/test/java/org/springframework/jms/annotation/AbstractJmsAnnotationDrivenTests.java b/spring-jms/src/test/java/org/springframework/jms/annotation/AbstractJmsAnnotationDrivenTests.java index 45016184a89..4e7d2b726d4 100644 --- a/spring-jms/src/test/java/org/springframework/jms/annotation/AbstractJmsAnnotationDrivenTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/annotation/AbstractJmsAnnotationDrivenTests.java @@ -59,17 +59,21 @@ public abstract class AbstractJmsAnnotationDrivenTests { public abstract void customConfiguration(); @Test - public abstract void defaultContainerFactoryConfiguration(); + public abstract void explicitContainerFactory(); + + @Test + public abstract void defaultContainerFactory(); @Test public abstract void jmsHandlerMethodFactoryConfiguration() throws JMSException; /** - * Test for {@link SampleBean} discovery. + * Test for {@link SampleBean} discovery. If a factory with the default name + * is set, an endpoint will use it automatically */ public void testSampleConfiguration(ApplicationContext context) { JmsListenerContainerTestFactory defaultFactory = - context.getBean("defaultFactory", JmsListenerContainerTestFactory.class); + context.getBean("jmsListenerContainerFactory", JmsListenerContainerTestFactory.class); JmsListenerContainerTestFactory simpleFactory = context.getBean("simpleFactory", JmsListenerContainerTestFactory.class); assertEquals(1, defaultFactory.getContainers().size()); @@ -79,7 +83,7 @@ public abstract class AbstractJmsAnnotationDrivenTests { @Component static class SampleBean { - @JmsListener(containerFactory = "defaultFactory", destination = "myQueue") + @JmsListener(destination = "myQueue") public void defaultHandle(String msg) { } @@ -89,7 +93,9 @@ public abstract class AbstractJmsAnnotationDrivenTests { } /** - * Test for {@link FullBean} discovery. + * Test for {@link FullBean} discovery. In this case, no default is set because + * all endpoints provide a default registry. This shows that the default factory + * is only retrieved if it needs to be. */ public void testFullConfiguration(ApplicationContext context) { JmsListenerContainerTestFactory simpleFactory = @@ -116,11 +122,12 @@ public abstract class AbstractJmsAnnotationDrivenTests { /** * Test for {@link CustomBean} and an manually endpoint registered - * with "myCustomEndpointId". + * with "myCustomEndpointId". The custom endpoint does not provide + * any factory so it's registered with the default one */ public void testCustomConfiguration(ApplicationContext context) { JmsListenerContainerTestFactory defaultFactory = - context.getBean("defaultFactory", JmsListenerContainerTestFactory.class); + context.getBean("jmsListenerContainerFactory", JmsListenerContainerTestFactory.class); JmsListenerContainerTestFactory customFactory = context.getBean("customFactory", JmsListenerContainerTestFactory.class); assertEquals(1, defaultFactory.getContainers().size()); @@ -150,11 +157,22 @@ public abstract class AbstractJmsAnnotationDrivenTests { /** * Test for {@link DefaultBean} that does not define the container - * factory to use as a default is registered. + * factory to use as a default is registered with an explicit + * default. + */ + public void testExplicitContainerFactoryConfiguration(ApplicationContext context) { + JmsListenerContainerTestFactory defaultFactory = + context.getBean("simpleFactory", JmsListenerContainerTestFactory.class); + assertEquals(1, defaultFactory.getContainers().size()); + } + + /** + * Test for {@link DefaultBean} that does not define the container + * factory to use as a default is registered with the default name. */ public void testDefaultContainerFactoryConfiguration(ApplicationContext context) { JmsListenerContainerTestFactory defaultFactory = - context.getBean("defaultFactory", JmsListenerContainerTestFactory.class); + context.getBean("jmsListenerContainerFactory", JmsListenerContainerTestFactory.class); assertEquals(1, defaultFactory.getContainers().size()); } diff --git a/spring-jms/src/test/java/org/springframework/jms/annotation/AnnotationDrivenNamespaceTests.java b/spring-jms/src/test/java/org/springframework/jms/annotation/AnnotationDrivenNamespaceTests.java index 89981a3c969..a6859c31aa7 100644 --- a/spring-jms/src/test/java/org/springframework/jms/annotation/AnnotationDrivenNamespaceTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/annotation/AnnotationDrivenNamespaceTests.java @@ -24,7 +24,6 @@ import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerEndpointRegistrar; import org.springframework.jms.config.SimpleJmsListenerEndpoint; import org.springframework.jms.listener.adapter.ListenerExecutionFailedException; @@ -62,9 +61,16 @@ public class AnnotationDrivenNamespaceTests extends AbstractJmsAnnotationDrivenT @Override @Test - public void defaultContainerFactoryConfiguration() { + public void explicitContainerFactory() { ApplicationContext context = new ClassPathXmlApplicationContext( "annotation-driven-custom-container-factory.xml", getClass()); + testExplicitContainerFactoryConfiguration(context); + } + + @Override + public void defaultContainerFactory() { + ApplicationContext context = new ClassPathXmlApplicationContext( + "annotation-driven-default-container-factory.xml", getClass()); testDefaultContainerFactoryConfiguration(context); } @@ -82,23 +88,18 @@ public class AnnotationDrivenNamespaceTests extends AbstractJmsAnnotationDrivenT private MessageListener messageListener; - private JmsListenerContainerFactory containerFactory; - @Override public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) { SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint(); endpoint.setId("myCustomEndpointId"); endpoint.setDestination("myQueue"); endpoint.setMessageListener(messageListener); - registrar.registerEndpoint(endpoint, containerFactory); + registrar.registerEndpoint(endpoint); } public void setMessageListener(MessageListener messageListener) { this.messageListener = messageListener; } - public void setContainerFactory(JmsListenerContainerFactory containerFactory) { - this.containerFactory = containerFactory; - } } } diff --git a/spring-jms/src/test/java/org/springframework/jms/annotation/EnableJmsTests.java b/spring-jms/src/test/java/org/springframework/jms/annotation/EnableJmsTests.java index 4e2cfe393ed..b0150e95b48 100644 --- a/spring-jms/src/test/java/org/springframework/jms/annotation/EnableJmsTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/annotation/EnableJmsTests.java @@ -54,7 +54,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { @Test public void sampleConfiguration() { ConfigurableApplicationContext context = new AnnotationConfigApplicationContext( - EnableJmsConfig.class, SampleBean.class); + EnableJmsSampleConfig.class, SampleBean.class); testSampleConfiguration(context); } @@ -62,7 +62,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { @Test public void fullConfiguration() { ConfigurableApplicationContext context = new AnnotationConfigApplicationContext( - EnableJmsConfig.class, FullBean.class); + EnableJmsFullConfig.class, FullBean.class); testFullConfiguration(context); } @@ -76,7 +76,15 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { @Override @Test - public void defaultContainerFactoryConfiguration() { + public void explicitContainerFactory() { + ConfigurableApplicationContext context = new AnnotationConfigApplicationContext( + EnableJmsCustomContainerFactoryConfig.class, DefaultBean.class); + testExplicitContainerFactoryConfiguration(context); + } + + @Override + @Test + public void defaultContainerFactory() { ConfigurableApplicationContext context = new AnnotationConfigApplicationContext( EnableJmsDefaultContainerFactoryConfig.class, DefaultBean.class); testDefaultContainerFactoryConfiguration(context); @@ -98,15 +106,15 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { thrown.expect(BeanCreationException.class); thrown.expectMessage("customFactory"); // Not found new AnnotationConfigApplicationContext( - EnableJmsConfig.class, CustomBean.class); + EnableJmsSampleConfig.class, CustomBean.class); } @EnableJms @Configuration - static class EnableJmsConfig { + static class EnableJmsSampleConfig { @Bean - public JmsListenerContainerTestFactory defaultFactory() { + public JmsListenerContainerTestFactory jmsListenerContainerFactory() { return new JmsListenerContainerTestFactory(); } @@ -116,12 +124,19 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { } } + @EnableJms @Configuration - @Import(EnableJmsConfig.class) - static class EnableJmsCustomConfig implements JmsListenerConfigurer { + static class EnableJmsFullConfig { - @Autowired - private EnableJmsConfig jmsConfig; + @Bean + public JmsListenerContainerTestFactory simpleFactory() { + return new JmsListenerContainerTestFactory(); + } + } + + @Configuration + @EnableJms + static class EnableJmsCustomConfig implements JmsListenerConfigurer { @Override public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) { @@ -132,7 +147,12 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { endpoint.setId("myCustomEndpointId"); endpoint.setDestination("myQueue"); endpoint.setMessageListener(simpleMessageListener()); - registrar.registerEndpoint(endpoint, jmsConfig.defaultFactory()); + registrar.registerEndpoint(endpoint); + } + + @Bean + public JmsListenerContainerTestFactory jmsListenerContainerFactory() { + return new JmsListenerContainerTestFactory(); } @Bean @@ -152,20 +172,32 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { } @Configuration - @Import(EnableJmsConfig.class) - static class EnableJmsDefaultContainerFactoryConfig implements JmsListenerConfigurer { - - @Autowired - private EnableJmsConfig jmsConfig; + @EnableJms + static class EnableJmsCustomContainerFactoryConfig implements JmsListenerConfigurer { @Override public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) { - registrar.setDefaultContainerFactory(jmsConfig.defaultFactory()); + registrar.setContainerFactory(simpleFactory()); + } + + @Bean + public JmsListenerContainerTestFactory simpleFactory() { + return new JmsListenerContainerTestFactory(); } } @Configuration - @Import(EnableJmsConfig.class) + @EnableJms + static class EnableJmsDefaultContainerFactoryConfig { + + @Bean + public JmsListenerContainerTestFactory jmsListenerContainerFactory() { + return new JmsListenerContainerTestFactory(); + } + } + + @Configuration + @EnableJms static class EnableJmsHandlerMethodFactoryConfig implements JmsListenerConfigurer { @Override @@ -179,6 +211,11 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { factory.setValidator(new TestValidator()); return factory; } + + @Bean + public JmsListenerContainerTestFactory defaultFactory() { + return new JmsListenerContainerTestFactory(); + } } } diff --git a/spring-jms/src/test/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessorTests.java b/spring-jms/src/test/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessorTests.java index 6b0a96c9ae9..4d28a7a31ad 100644 --- a/spring-jms/src/test/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessorTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessorTests.java @@ -113,7 +113,7 @@ public class JmsListenerAnnotationBeanPostProcessorTests { public JmsListenerAnnotationBeanPostProcessor postProcessor() { JmsListenerAnnotationBeanPostProcessor postProcessor = new JmsListenerAnnotationBeanPostProcessor(); postProcessor.setEndpointRegistry(jmsListenerEndpointRegistry()); - postProcessor.setDefaultContainerFactory(testFactory()); + postProcessor.setContainerFactoryBeanName("testFactory"); return postProcessor; } diff --git a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerEndpointRegistrarTests.java b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerEndpointRegistrarTests.java index c811950315c..f4dd33da297 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerEndpointRegistrarTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerEndpointRegistrarTests.java @@ -23,6 +23,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.springframework.context.support.StaticApplicationContext; + /** * * @author Stephane Nicoll @@ -41,6 +43,7 @@ public class JmsListenerEndpointRegistrarTests { @Before public void setup() { registrar.setEndpointRegistry(registry); + registrar.setApplicationContext(new StaticApplicationContext()); } @Test @@ -59,7 +62,7 @@ public class JmsListenerEndpointRegistrarTests { public void registerNullContainerFactoryIsAllowed() throws Exception { SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint(); endpoint.setId("some id"); - registrar.setDefaultContainerFactory(containerFactory); + registrar.setContainerFactory(containerFactory); registrar.registerEndpoint(endpoint, null); registrar.afterPropertiesSet(); assertNotNull("Container not created", registry.getContainer("some id")); @@ -81,7 +84,7 @@ public class JmsListenerEndpointRegistrarTests { public void registerContainerWithoutFactory() throws Exception { SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint(); endpoint.setId("myEndpoint"); - registrar.setDefaultContainerFactory(containerFactory); + registrar.setContainerFactory(containerFactory); registrar.registerEndpoint(endpoint); registrar.afterPropertiesSet(); assertNotNull("Container not created", registry.getContainer("myEndpoint")); diff --git a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-container-factory.xml b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-container-factory.xml index 98edbfff80e..c2f225c846e 100644 --- a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-container-factory.xml +++ b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-container-factory.xml @@ -7,11 +7,11 @@ http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd"> - + - + \ No newline at end of file diff --git a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-registry.xml b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-registry.xml index a05f762ae9d..520764f2ffd 100644 --- a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-registry.xml +++ b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-custom-registry.xml @@ -13,14 +13,13 @@ - + - diff --git a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-default-container-factory.xml b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-default-container-factory.xml new file mode 100644 index 00000000000..7bff1a219a0 --- /dev/null +++ b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-default-container-factory.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-sample-config.xml b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-sample-config.xml index 2bc2820432b..4c3b85f2e69 100644 --- a/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-sample-config.xml +++ b/spring-jms/src/test/resources/org/springframework/jms/annotation/annotation-driven-sample-config.xml @@ -11,7 +11,7 @@ - +