From 444b9032be7fa73d12103cbf351f82751b08a95b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 20 Apr 2015 09:51:33 +0200 Subject: [PATCH] Apply DestinationResolver to listener container Previously, a custom `DestinationResolver` was not made available to the underlying `MessageListener`: if a reply needs to be sent, the default `DestinationResolver` was used. This commit ensures that if a custom `DestinationResolver` has been set, it is also configured accordingly for replies. Issue: SPR-12927 --- .../jms/config/MethodJmsListenerEndpoint.java | 5 +++++ .../jms/listener/MessageListenerContainer.java | 7 +++++++ .../endpoint/JmsMessageEndpointManager.java | 8 ++++++++ .../StandardJmsActivationSpecFactory.java | 8 +++++++- .../config/JmsListenerContainerFactoryTests.java | 1 + .../jms/config/MessageListenerTestContainer.java | 6 ++++++ .../config/MethodJmsListenerEndpointTests.java | 16 ++++++++++++++++ .../endpoint/JmsMessageEndpointManagerTests.java | 6 ++++++ 8 files changed, 56 insertions(+), 1 deletion(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java b/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java index 013146b95a..4855573d63 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java @@ -27,6 +27,7 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; @@ -110,6 +111,10 @@ public class MethodJmsListenerEndpoint extends AbstractJmsListenerEndpoint { if (messageConverter != null) { messageListener.setMessageConverter(messageConverter); } + DestinationResolver destinationResolver = container.getDestinationResolver(); + if (destinationResolver != null) { + messageListener.setDestinationResolver(destinationResolver); + } return messageListener; } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java index 920c9d4029..2457c53781 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java @@ -18,6 +18,7 @@ package org.springframework.jms.listener; import org.springframework.context.SmartLifecycle; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.destination.DestinationResolver; /** * Internal abstraction used by the framework representing a message @@ -41,6 +42,12 @@ public interface MessageListenerContainer extends SmartLifecycle { */ MessageConverter getMessageConverter(); + /** + * Return the {@link DestinationResolver} to use to resolve + * destinations by names. + */ + DestinationResolver getDestinationResolver(); + /** * Return whether the Publish/Subscribe domain ({@link javax.jms.Topic Topics}) is used. * Otherwise, the Point-to-Point domain ({@link javax.jms.Queue Queues}) is used. diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java index 774dd75e90..8af16f5991 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java @@ -191,6 +191,14 @@ public class JmsMessageEndpointManager extends GenericMessageEndpointManager return null; } + @Override + public DestinationResolver getDestinationResolver() { + if (this.activationSpecFactory instanceof StandardJmsActivationSpecFactory) { + return ((StandardJmsActivationSpecFactory) this.activationSpecFactory).getDestinationResolver(); + } + return null; + } + @Override public boolean isPubSubDomain() { JmsActivationSpecConfig config = getActivationSpecConfig(); diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java index e90f2bdc45..4cc2bd97d7 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java @@ -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. @@ -90,6 +90,12 @@ public class StandardJmsActivationSpecFactory implements JmsActivationSpecFactor this.destinationResolver = destinationResolver; } + /** + * Return the {@link DestinationResolver} to use for resolving destinations names. + */ + public DestinationResolver getDestinationResolver() { + return destinationResolver; + } @Override public ActivationSpec createActivationSpec(ResourceAdapter adapter, JmsActivationSpecConfig config) { diff --git a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerFactoryTests.java b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerFactoryTests.java index 9430491ff8..9465e8db0a 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerFactoryTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerFactoryTests.java @@ -186,6 +186,7 @@ public class JmsListenerContainerFactoryTests { private void assertDefaultJcaConfig(JmsMessageEndpointManager container) { assertEquals(messageConverter, container.getMessageConverter()); + assertEquals(destinationResolver, container.getDestinationResolver()); JmsActivationSpecConfig config = container.getActivationSpecConfig(); assertNotNull(config); assertEquals(Session.DUPS_OK_ACKNOWLEDGE, config.getAcknowledgeMode()); 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 0a716a0640..7c723b7f42 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 @@ -21,6 +21,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.jms.JmsException; import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.destination.DestinationResolver; /** * @author Stephane Nicoll @@ -103,6 +104,11 @@ public class MessageListenerTestContainer return null; } + @Override + public DestinationResolver getDestinationResolver() { + return null; + } + @Override public boolean isPubSubDomain() { return true; diff --git a/spring-jms/src/test/java/org/springframework/jms/config/MethodJmsListenerEndpointTests.java b/spring-jms/src/test/java/org/springframework/jms/config/MethodJmsListenerEndpointTests.java index 6b765d5299..090ecec307 100644 --- a/spring-jms/src/test/java/org/springframework/jms/config/MethodJmsListenerEndpointTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/config/MethodJmsListenerEndpointTests.java @@ -36,6 +36,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TestName; +import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.support.StaticListableBeanFactory; import org.springframework.jms.StubTextMessage; import org.springframework.jms.listener.DefaultMessageListenerContainer; @@ -46,6 +47,7 @@ import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter; import org.springframework.jms.listener.adapter.ReplyFailureException; import org.springframework.jms.support.JmsHeaders; import org.springframework.jms.support.JmsMessageHeaderAccessor; +import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -107,6 +109,20 @@ public class MethodJmsListenerEndpointTests { assertNotNull(endpoint.createMessageListener(container)); } + @Test + public void setExtraCollaborators() { + MessageConverter messageConverter = mock(MessageConverter.class); + DestinationResolver destinationResolver = mock(DestinationResolver.class); + this.container.setMessageConverter(messageConverter); + this.container.setDestinationResolver(destinationResolver); + + MessagingMessageListenerAdapter listener = createInstance(this.factory, + getListenerMethod("resolveObjectPayload", MyBean.class), container); + DirectFieldAccessor accessor = new DirectFieldAccessor(listener); + assertSame(messageConverter, accessor.getPropertyValue("messageConverter")); + assertSame(destinationResolver, accessor.getPropertyValue("destinationResolver")); + } + @Test public void resolveMessageAndSession() throws JMSException { MessagingMessageListenerAdapter listener = createDefaultInstance(javax.jms.Message.class, Session.class); diff --git a/spring-jms/src/test/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManagerTests.java b/spring-jms/src/test/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManagerTests.java index c1d88177f5..acb9f058f3 100644 --- a/spring-jms/src/test/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManagerTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManagerTests.java @@ -82,4 +82,10 @@ public class JmsMessageEndpointManagerTests { JmsMessageEndpointManager endpoint = new JmsMessageEndpointManager(); assertNull(endpoint.getMessageConverter()); } + + @Test + public void getDestinationResolverNoConfig() { + JmsMessageEndpointManager endpoint = new JmsMessageEndpointManager(); + assertNull(endpoint.getDestinationResolver()); + } }