Register lazy @JmsListener components
Support the creation and registration of message listener containers in a lazy manner, that is after the container initialization has completed. Such support brought an interesting brainstorming of the thread safety if JmsListenerEndpointRegistrar and JmsListenerEndpointRegistry so those have also been revisited as part of this commit. Issue: SPR-12774
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2014 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -29,17 +29,22 @@ import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.context.annotation.PropertySource;
|
||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
||||
import org.springframework.jms.config.JmsListenerContainerTestFactory;
|
||||
import org.springframework.jms.config.JmsListenerEndpointRegistrar;
|
||||
import org.springframework.jms.config.JmsListenerEndpointRegistry;
|
||||
import org.springframework.jms.config.MessageListenerTestContainer;
|
||||
import org.springframework.jms.config.SimpleJmsListenerEndpoint;
|
||||
import org.springframework.jms.listener.adapter.ListenerExecutionFailedException;
|
||||
import org.springframework.jms.listener.adapter.MessageListenerAdapter;
|
||||
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
|
||||
import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory;
|
||||
import org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* @author Stephane Nicoll
|
||||
@@ -115,6 +120,22 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests {
|
||||
EnableJmsSampleConfig.class, CustomBean.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lazyComponent() {
|
||||
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(
|
||||
EnableJmsDefaultContainerFactoryConfig.class, LazyBean.class);
|
||||
JmsListenerContainerTestFactory defaultFactory =
|
||||
context.getBean("jmsListenerContainerFactory", JmsListenerContainerTestFactory.class);
|
||||
assertEquals(0, defaultFactory.getListenerContainers().size());
|
||||
|
||||
context.getBean(LazyBean.class); // trigger lazy resolution
|
||||
assertEquals(1, defaultFactory.getListenerContainers().size());
|
||||
MessageListenerTestContainer container = defaultFactory.getListenerContainers().get(0);
|
||||
assertTrue("Should have been started " + container, container.isStarted());
|
||||
context.close(); // Close and stop the listeners
|
||||
assertTrue("Should have been stopped " + container, container.isStopped());
|
||||
}
|
||||
|
||||
@EnableJms
|
||||
@Configuration
|
||||
static class EnableJmsSampleConfig {
|
||||
@@ -240,4 +261,13 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Component
|
||||
@Lazy
|
||||
static class LazyBean {
|
||||
|
||||
@JmsListener(destination = "myQueue")
|
||||
public void handle(String msg) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user