Skip to content

Commit bd05e3a

Browse files
committed
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
1 parent bd601ce commit bd05e3a

File tree

8 files changed

+56
-1
lines changed

8 files changed

+56
-1
lines changed

spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.jms.listener.MessageListenerContainer;
2626
import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter;
2727
import org.springframework.jms.support.converter.MessageConverter;
28+
import org.springframework.jms.support.destination.DestinationResolver;
2829
import org.springframework.messaging.handler.annotation.SendTo;
2930
import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory;
3031
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
@@ -100,6 +101,10 @@ protected MessagingMessageListenerAdapter createMessageListener(MessageListenerC
100101
if (messageConverter != null) {
101102
messageListener.setMessageConverter(messageConverter);
102103
}
104+
DestinationResolver destinationResolver = container.getDestinationResolver();
105+
if (destinationResolver != null) {
106+
messageListener.setDestinationResolver(destinationResolver);
107+
}
103108
return messageListener;
104109
}
105110

spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.springframework.context.SmartLifecycle;
2020
import org.springframework.jms.support.converter.MessageConverter;
21+
import org.springframework.jms.support.destination.DestinationResolver;
2122

2223
/**
2324
* Internal abstraction used by the framework representing a message
@@ -41,6 +42,12 @@ public interface MessageListenerContainer extends SmartLifecycle {
4142
*/
4243
MessageConverter getMessageConverter();
4344

45+
/**
46+
* Return the {@link DestinationResolver} to use to resolve
47+
* destinations by names.
48+
*/
49+
DestinationResolver getDestinationResolver();
50+
4451
/**
4552
* Return whether the Publish/Subscribe domain ({@link javax.jms.Topic Topics}) is used.
4653
* Otherwise, the Point-to-Point domain ({@link javax.jms.Queue Queues}) is used.

spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ public MessageConverter getMessageConverter() {
191191
return null;
192192
}
193193

194+
@Override
195+
public DestinationResolver getDestinationResolver() {
196+
if (this.activationSpecFactory instanceof StandardJmsActivationSpecFactory) {
197+
return ((StandardJmsActivationSpecFactory) this.activationSpecFactory).getDestinationResolver();
198+
}
199+
return null;
200+
}
201+
194202
@Override
195203
public boolean isPubSubDomain() {
196204
JmsActivationSpecConfig config = getActivationSpecConfig();

spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -90,6 +90,12 @@ public void setDestinationResolver(DestinationResolver destinationResolver) {
9090
this.destinationResolver = destinationResolver;
9191
}
9292

93+
/**
94+
* Return the {@link DestinationResolver} to use for resolving destinations names.
95+
*/
96+
public DestinationResolver getDestinationResolver() {
97+
return destinationResolver;
98+
}
9399

94100
@Override
95101
public ActivationSpec createActivationSpec(ResourceAdapter adapter, JmsActivationSpecConfig config) {

spring-jms/src/test/java/org/springframework/jms/config/JmsListenerContainerFactoryTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ private void setDefaultJcaConfig(DefaultJcaListenerContainerFactory factory) {
182182

183183
private void assertDefaultJcaConfig(JmsMessageEndpointManager container) {
184184
assertEquals(messageConverter, container.getMessageConverter());
185+
assertEquals(destinationResolver, container.getDestinationResolver());
185186
JmsActivationSpecConfig config = container.getActivationSpecConfig();
186187
assertNotNull(config);
187188
assertEquals(Session.DUPS_OK_ACKNOWLEDGE, config.getAcknowledgeMode());

spring-jms/src/test/java/org/springframework/jms/config/MessageListenerTestContainer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.jms.JmsException;
2222
import org.springframework.jms.listener.MessageListenerContainer;
2323
import org.springframework.jms.support.converter.MessageConverter;
24+
import org.springframework.jms.support.destination.DestinationResolver;
2425

2526
/**
2627
* @author Stephane Nicoll
@@ -103,6 +104,11 @@ public MessageConverter getMessageConverter() {
103104
return null;
104105
}
105106

107+
@Override
108+
public DestinationResolver getDestinationResolver() {
109+
return null;
110+
}
111+
106112
@Override
107113
public boolean isPubSubDomain() {
108114
return true;

spring-jms/src/test/java/org/springframework/jms/config/MethodJmsListenerEndpointTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.junit.rules.ExpectedException;
3737
import org.junit.rules.TestName;
3838

39+
import org.springframework.beans.DirectFieldAccessor;
3940
import org.springframework.beans.factory.support.StaticListableBeanFactory;
4041
import org.springframework.jms.StubTextMessage;
4142
import org.springframework.jms.listener.DefaultMessageListenerContainer;
@@ -46,6 +47,7 @@
4647
import org.springframework.jms.listener.adapter.ReplyFailureException;
4748
import org.springframework.jms.support.JmsHeaders;
4849
import org.springframework.jms.support.JmsMessageHeaderAccessor;
50+
import org.springframework.jms.support.converter.MessageConverter;
4951
import org.springframework.jms.support.destination.DestinationResolver;
5052
import org.springframework.messaging.Message;
5153
import org.springframework.messaging.MessageHeaders;
@@ -107,6 +109,20 @@ public void createMessageListener() {
107109
assertNotNull(endpoint.createMessageListener(container));
108110
}
109111

112+
@Test
113+
public void setExtraCollaborators() {
114+
MessageConverter messageConverter = mock(MessageConverter.class);
115+
DestinationResolver destinationResolver = mock(DestinationResolver.class);
116+
this.container.setMessageConverter(messageConverter);
117+
this.container.setDestinationResolver(destinationResolver);
118+
119+
MessagingMessageListenerAdapter listener = createInstance(this.factory,
120+
getListenerMethod("resolveObjectPayload", MyBean.class), container);
121+
DirectFieldAccessor accessor = new DirectFieldAccessor(listener);
122+
assertSame(messageConverter, accessor.getPropertyValue("messageConverter"));
123+
assertSame(destinationResolver, accessor.getPropertyValue("destinationResolver"));
124+
}
125+
110126
@Test
111127
public void resolveMessageAndSession() throws JMSException {
112128
MessagingMessageListenerAdapter listener = createDefaultInstance(javax.jms.Message.class, Session.class);

spring-jms/src/test/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManagerTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,10 @@ public void getMessageConverterNoConfig() {
6161
JmsMessageEndpointManager endpoint = new JmsMessageEndpointManager();
6262
assertNull(endpoint.getMessageConverter());
6363
}
64+
65+
@Test
66+
public void getDestinationResolverNoConfig() {
67+
JmsMessageEndpointManager endpoint = new JmsMessageEndpointManager();
68+
assertNull(endpoint.getDestinationResolver());
69+
}
6470
}

0 commit comments

Comments
 (0)