diff --git a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java index 709572f9b6..7710ed273d 100644 --- a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java +++ b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -398,7 +398,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen /** * Various reference types supported by this map. */ - public static enum ReferenceType { + public enum ReferenceType { /** Use {@link SoftReference}s */ SOFT, @@ -636,7 +636,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * A reference to an {@link Entry} contained in the map. Implementations are usually * wrappers around specific Java reference implementations (e.g., {@link SoftReference}). */ - protected static interface Reference { + protected interface Reference { /** * Returns the referenced entry or {@code null} if the entry is no longer @@ -765,7 +765,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen /** * Various options supported by a {@code Task}. */ - private static enum TaskOption { + private enum TaskOption { RESTRUCTURE_BEFORE, RESTRUCTURE_AFTER, SKIP_IF_EMPTY, RESIZE } @@ -912,7 +912,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen /** * The types of restructuring that can be performed. */ - protected static enum Restructure { + protected enum Restructure { WHEN_NECESSARY, NEVER } diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java index 7f7c419cb6..4d48fb31fe 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java @@ -26,7 +26,6 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; @@ -72,11 +71,19 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc private boolean contextRefreshed; + @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + if (event.getApplicationContext() == this.applicationContext) { + this.contextRefreshed = true; + } + } + /** * Return the {@link MessageListenerContainer} with the specified id or @@ -107,7 +114,6 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc return Collections.unmodifiableCollection(this.listenerContainers.values()); } - /** * Create a message listener container for the given {@link JmsListenerEndpoint}. *

This create the necessary infrastructure to honor that endpoint @@ -129,8 +135,9 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc String id = endpoint.getId(); Assert.notNull(id, "Endpoint id must not be null"); synchronized (this.listenerContainers) { - Assert.state(!this.listenerContainers.containsKey(id), - "Another endpoint is already registered with id '" + id + "'"); + if (this.listenerContainers.containsKey(id)) { + throw new IllegalStateException("Another endpoint is already registered with id '" + id + "'"); + } MessageListenerContainer container = createListenerContainer(endpoint, factory); this.listenerContainers.put(id, container); if (startImmediately) { @@ -181,28 +188,6 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc } - @Override - public void destroy() { - for (MessageListenerContainer listenerContainer : getListenerContainers()) { - if (listenerContainer instanceof DisposableBean) { - try { - ((DisposableBean) listenerContainer).destroy(); - } - catch (Throwable ex) { - logger.warn("Failed to destroy message listener container", ex); - } - } - } - } - - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - if (event.getApplicationContext().equals(this.applicationContext)) { - this.contextRefreshed = true; - } - } - // Delegating implementation of SmartLifecycle @Override @@ -259,6 +244,20 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc } } + @Override + public void destroy() { + for (MessageListenerContainer listenerContainer : getListenerContainers()) { + if (listenerContainer instanceof DisposableBean) { + try { + ((DisposableBean) listenerContainer).destroy(); + } + catch (Throwable ex) { + logger.warn("Failed to destroy message listener container", ex); + } + } + } + } + private static class AggregatingCallback implements Runnable { 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 d0726af9af..5351ba0662 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 @@ -187,7 +187,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { @SuppressWarnings("resource") public void unknownFactory() { thrown.expect(BeanCreationException.class); - thrown.expectMessage("customFactory"); // Not found + thrown.expectMessage("customFactory"); // not found new AnnotationConfigApplicationContext(EnableJmsSampleConfig.class, CustomBean.class); } @@ -199,11 +199,11 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { context.getBean("jmsListenerContainerFactory", JmsListenerContainerTestFactory.class); assertEquals(0, defaultFactory.getListenerContainers().size()); - context.getBean(LazyBean.class); // trigger lazy resolution + 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 + context.close(); // close and stop the listeners assertTrue("Should have been stopped " + container, container.isStopped()); } @@ -339,6 +339,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { } } + @Configuration @EnableJms static class EnableJmsAutoStartupFalseConfig implements JmsListenerConfigurer { @@ -378,6 +379,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { String concurrency() default ""; } + @JmsListener(destination = "billingQueue") @Retention(RetentionPolicy.RUNTIME) private @interface BillingQueueListener { @@ -389,6 +391,7 @@ public class EnableJmsTests extends AbstractJmsAnnotationDrivenTests { String concurrency() default ""; } + @Component static class ComposedJmsListenersBean { diff --git a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerTestFactory.java b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerTestFactory.java index 15afc3962a..611b823dcd 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerTestFactory.java +++ b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerTestFactory.java @@ -31,10 +31,12 @@ public class JmsListenerContainerTestFactory implements JmsListenerContainerFact private final Map listenerContainers = new LinkedHashMap<>(); + public void setAutoStartup(boolean autoStartup) { this.autoStartup = autoStartup; } + public List getListenerContainers() { return new ArrayList<>(this.listenerContainers.values()); } diff --git a/spring-jms/src/test/java/org/springframework/jms/config/MessageListenerTestContainer.java b/spring-jms/src/test/java/org/springframework/jms/config/MessageListenerTestContainer.java index dea96feda8..e21b532088 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/MessageListenerTestContainer.java +++ b/spring-jms/src/test/java/org/springframework/jms/config/MessageListenerTestContainer.java @@ -26,8 +26,7 @@ import org.springframework.jms.support.destination.DestinationResolver; /** * @author Stephane Nicoll */ -public class MessageListenerTestContainer - implements MessageListenerContainer, InitializingBean, DisposableBean { +public class MessageListenerTestContainer implements MessageListenerContainer, InitializingBean, DisposableBean { private final JmsListenerEndpoint endpoint; @@ -41,10 +40,12 @@ public class MessageListenerTestContainer private boolean destroyInvoked; + MessageListenerTestContainer(JmsListenerEndpoint endpoint) { this.endpoint = endpoint; } + public void setAutoStartup(boolean autoStartup) { this.autoStartup = autoStartup; } @@ -133,8 +134,7 @@ public class MessageListenerTestContainer @Override public void destroy() { if (!stopInvoked) { - throw new IllegalStateException("Stop should have been invoked before " + - "destroy on " + this); + throw new IllegalStateException("Stop should have been invoked before " + "destroy on " + this); } destroyInvoked = true; } @@ -150,4 +150,5 @@ public class MessageListenerTestContainer sb.append('}'); return sb.toString(); } + } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java index 10f40141c5..79a33b87e1 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -132,7 +132,7 @@ public class TransportHandlingSockJsService extends AbstractSockJsService implem public SockJsMessageCodec getMessageCodec() { Assert.state(this.messageCodec != null, "A SockJsMessageCodec is required but not available: " + - "Add Jackson 2 to the classpath, or configure a custom SockJsMessageCodec."); + "Add Jackson to the classpath, or configure a custom SockJsMessageCodec."); return this.messageCodec; }