Refactored RouterMessageHandlerAdapter (now RouterMessageHandler). Router endpoints are now SimpleEndpoint instances.

This commit is contained in:
Mark Fisher
2008-08-12 03:44:23 +00:00
parent f91ec6f48f
commit 178c438159
5 changed files with 343 additions and 426 deletions

View File

@@ -16,8 +16,10 @@
package org.springframework.integration.config;
import org.springframework.integration.endpoint.MessageEndpoint;
import org.springframework.integration.endpoint.SimpleEndpoint;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.router.RouterMessageHandlerAdapter;
import org.springframework.integration.router.RouterMessageHandler;
/**
* Parser for the <router/> element.
@@ -26,9 +28,14 @@ import org.springframework.integration.router.RouterMessageHandlerAdapter;
*/
public class RouterParser extends AbstractHandlerEndpointParser {
@Override
protected Class<? extends MessageEndpoint> getEndpointClass() {
return SimpleEndpoint.class;
}
@Override
protected Class<? extends MessageHandler> getHandlerAdapterClass() {
return RouterMessageHandlerAdapter.class;
return RouterMessageHandler.class;
}
}

View File

@@ -0,0 +1,104 @@
/*
* Copyright 2002-2008 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.router;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.handler.AbstractMessageHandler;
import org.springframework.integration.message.CompositeMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageTarget;
/**
* MessageHandler adapter for methods annotated with {@link Router @Router}.
*
* @author Mark Fisher
*/
public class RouterMessageHandler extends AbstractMessageHandler {
private volatile MessageChannel defaultChannel;
public RouterMessageHandler(Object object, Method method) {
super(object, method);
}
public RouterMessageHandler(Object object, String methodName) {
super(object, methodName);
}
public RouterMessageHandler() {
}
public void setDefaultChannel(MessageChannel defaultChannel) {
this.defaultChannel = defaultChannel;
}
@Override
protected Message<?> createReplyMessage(Object result, Message<?> requestMessage) {
final List<Object> channels = new ArrayList<Object>();
if (result != null) {
if (result instanceof Collection) {
channels.addAll((Collection<?>) result);
}
else if (result instanceof MessageChannel[]) {
channels.addAll(Arrays.asList((MessageChannel[]) result));
}
else if (result instanceof String[]) {
channels.addAll(Arrays.asList((String[]) result));
}
else if (result instanceof MessageChannel) {
channels.add((MessageChannel) result);
}
else if (result instanceof String) {
channels.add(result);
}
else {
throw new ConfigurationException(
"router method must return type 'MessageChannel' or 'String'");
}
}
if (channels.size() == 0) {
if (this.defaultChannel != null) {
return MessageBuilder.fromMessage(requestMessage).setNextTarget(this.defaultChannel).build();
}
return null;
}
List<Message<?>> replies = new ArrayList<Message<?>>();
for (Object channel : channels) {
MessageBuilder<?> builder = MessageBuilder.fromMessage(requestMessage);
if (channel instanceof MessageTarget) {
builder.setNextTarget((MessageTarget) channel);
}
else if (channel instanceof String) {
builder.setNextTarget((String) channel);
}
replies.add(builder.build());
}
return new CompositeMessage(replies);
}
}

View File

@@ -1,137 +0,0 @@
/*
* Copyright 2002-2008 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.router;
import java.lang.reflect.Method;
import java.util.Collection;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.channel.ChannelRegistry;
import org.springframework.integration.channel.ChannelRegistryAware;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.handler.AbstractMessageHandlerAdapter;
import org.springframework.integration.handler.annotation.AnnotationMethodMessageMapper;
import org.springframework.integration.message.Message;
/**
* MessageHandler adapter for methods annotated with {@link Router @Router}.
*
* @author Mark Fisher
*/
public class RouterMessageHandlerAdapter extends AbstractMessageHandlerAdapter implements ChannelRegistryAware {
private volatile ChannelRegistry channelRegistry;
public RouterMessageHandlerAdapter(Object object, Method method) {
this.setObject(object);
this.setMethod(method);
if (method.getParameterTypes().length < 1) {
throw new ConfigurationException("The router method must accept at least one argument.");
}
if (method.getParameterTypes()[0].equals(Message.class)) {
this.setMethodExpectsMessage(true);
}
}
public RouterMessageHandlerAdapter(Object object, String methodName) {
this.setObject(object);
this.setMethodName(methodName);
}
public RouterMessageHandlerAdapter() {
}
public void setChannelRegistry(ChannelRegistry channelRegistry) {
this.channelRegistry = channelRegistry;
}
@Override
protected void initialize() {
Object target = this.getObject();
if (target != null && this.channelRegistry != null && (target instanceof ChannelRegistryAware)) {
((ChannelRegistryAware) target).setChannelRegistry(this.channelRegistry);
}
Method method = this.getMethod();
if (method != null) {
this.setMessageMapper(new AnnotationMethodMessageMapper(method));
}
}
@Override
protected Message<?> handleReturnValue(Object returnValue, Message<?> originalMessage) {
if (returnValue != null) {
if (returnValue instanceof Collection) {
Collection<?> channels = (Collection<?>) returnValue;
for (Object channel : channels) {
if (channel instanceof MessageChannel) {
this.sendMessage(originalMessage, (MessageChannel) channel);
}
else if (channel instanceof String) {
this.sendMessage(originalMessage, (String) channel);
}
else {
throw new ConfigurationException(
"router method must return type 'MessageChannel' or 'String'");
}
}
}
else if (returnValue instanceof MessageChannel[]) {
for (MessageChannel channel : (MessageChannel[]) returnValue) {
this.sendMessage(originalMessage, channel);
}
}
else if (returnValue instanceof String[]) {
for (String channelName : (String[]) returnValue) {
this.sendMessage(originalMessage, channelName);
}
}
else if (returnValue instanceof MessageChannel) {
this.sendMessage(originalMessage, (MessageChannel) returnValue);
}
else if (returnValue instanceof String) {
this.sendMessage(originalMessage, (String) returnValue);
}
else {
throw new ConfigurationException(
"router method must return type 'MessageChannel' or 'String'");
}
}
return null;
}
private boolean sendMessage(Message<?> message, String channelName) {
MessageChannel channel = this.channelRegistry.lookupChannel(channelName);
if (channel == null) {
if (logger.isWarnEnabled()) {
logger.warn("unable to resolve channel for name '" + channelName + "'");
}
return false;
}
return this.sendMessage(message, channel);
}
private boolean sendMessage(Message<?> message, MessageChannel channel) {
if (logger.isDebugEnabled()) {
logger.debug("sending message to channel '" + channel + "'");
}
return channel.send(message);
}
}

View File

@@ -30,7 +30,7 @@ import org.springframework.integration.handler.config.AbstractMessageHandlerCrea
public class RouterMessageHandlerCreator extends AbstractMessageHandlerCreator {
public MessageHandler doCreateHandler(Object object, Method method, Map<String, ?> attributes) {
return new RouterMessageHandlerAdapter(object, method);
return new RouterMessageHandler(object, method);
}
}

View File

@@ -32,6 +32,7 @@ import org.springframework.integration.channel.DefaultChannelRegistry;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.handler.annotation.Header;
import org.springframework.integration.message.CompositeMessage;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
@@ -41,168 +42,147 @@ import org.springframework.integration.message.StringMessage;
/**
* @author Mark Fisher
*/
public class RouterMessageHandlerAdapterTests {
public class RouterMessageHandlerTests {
@Test
public void testChannelNameResolutionByPayloadConfiguredByMethodReference() throws Exception {
public void channelNameResolutionByPayloadConfiguredByMethodReference() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routePayload", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestChannelNameResolutionByPayload(adapter);
}
@Test
public void testChannelNameResolutionByPayloadConfiguredByMethodName() {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routePayload");
this.doTestChannelNameResolutionByPayload(adapter);
}
private void doTestChannelNameResolutionByPayload(RouterMessageHandlerAdapter adapter) {
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
Message<String> message = new GenericMessage<String>("bar");
QueueChannel barChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("bar-channel", barChannel);
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(message);
Message<?> result = barChannel.receive(0);
assertNotNull(result);
assertEquals("bar", result.getPayload());
Message<?> reply = handler.handle(message);
assertNotNull(reply);
assertEquals(CompositeMessage.class, reply.getClass());
List<Message<?>> replyMessages = ((CompositeMessage) reply).getPayload();
assertEquals(1, replyMessages.size());
Message<?> replyMessage = replyMessages.get(0);
assertEquals("bar", replyMessage.getPayload());
assertEquals("bar-channel", replyMessage.getHeaders().getNextTarget());
}
@Test
public void testChannelNameResolutionByHeader() throws Exception {
public void channelNameResolutionByPayloadConfiguredByMethodName() {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routePayload");
Message<String> message = new GenericMessage<String>("bar");
Message<?> reply = handler.handle(message);
assertNotNull(reply);
assertNotNull(reply);
assertEquals(CompositeMessage.class, reply.getClass());
List<Message<?>> replyMessages = ((CompositeMessage) reply).getPayload();
assertEquals(1, replyMessages.size());
Message<?> replyMessage = replyMessages.get(0);
assertEquals("bar", replyMessage.getPayload());
assertEquals("bar-channel", replyMessage.getHeaders().getNextTarget());
}
@Test
public void channelNameResolutionByHeader() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeByHeader", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
Message<String> message = MessageBuilder.fromPayload("bar")
.setHeader("returnAddress", "baz").build();
QueueChannel barChannel = new QueueChannel();
QueueChannel bazChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("bar-channel", barChannel);
channelRegistry.registerChannel("baz-channel", bazChannel);
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(message);
Message<?> message1 = barChannel.receive(0);
assertNull(message1);
Message<?> message2 = bazChannel.receive(0);
assertNotNull(message2);
assertEquals("bar", message2.getPayload());
.setHeader("targetChannel", "foo").build();
Message<?> reply = handler.handle(message);
assertNotNull(reply);
assertEquals(CompositeMessage.class, reply.getClass());
List<Message<?>> replyMessages = ((CompositeMessage) reply).getPayload();
assertEquals(1, replyMessages.size());
Message<?> replyMessage = replyMessages.get(0);
assertEquals("bar", replyMessage.getPayload());
assertEquals("foo-channel", replyMessage.getHeaders().getNextTarget());
}
@Test(expected=MessageHandlingException.class)
public void testFailsWhenRequireddHeaderIsNotProvided() throws Exception {
public void failsWhenRequireddHeaderIsNotProvided() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeByHeader", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
adapter.afterPropertiesSet();
adapter.handle(new GenericMessage<String>("testing"));
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
handler.handle(new GenericMessage<String>("testing"));
}
@Test
public void testChannelNameResolutionByMessageConfiguredByMethodReference() throws Exception {
public void channelNameResolutionByMessageConfiguredByMethodReference() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeMessage", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestChannelNameResolutionByMessage(adapter);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestChannelNameResolutionByMessage(handler);
}
@Test
public void testChannelNameResolutionByMessageConfiguredByMethodName() {
public void channelNameResolutionByMessageConfiguredByMethodName() {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessage");
this.doTestChannelNameResolutionByMessage(adapter);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessage");
this.doTestChannelNameResolutionByMessage(handler);
}
private void doTestChannelNameResolutionByMessage(RouterMessageHandlerAdapter adapter) {
private void doTestChannelNameResolutionByMessage(RouterMessageHandler handler) {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("foo-channel", fooChannel);
channelRegistry.registerChannel("bar-channel", barChannel);
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
Message<?> result1 = ((CompositeMessage) handler.handle(fooMessage)).getPayload().get(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
adapter.handle(barMessage);
Message<?> result2 = barChannel.receive(0);
Message<?> result2 = ((CompositeMessage) handler.handle(barMessage)).getPayload().get(0);
assertNotNull(result2);
assertEquals("bar", result2.getPayload());
adapter.handle(badMessage);
Message<?> result4 = fooChannel.receive(0);
assertNull(result4);
Message<?> result5 = barChannel.receive(0);
assertNull(result5);
assertNull(handler.handle(badMessage));
}
@Test
public void testChannelInstanceResolutionByPayloadConfiguredByMethodReference() throws Exception {
public void channelInstanceResolutionByPayloadConfiguredByMethodReference() throws Exception {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
SingleChannelInstanceRoutingTestBean testBean = new SingleChannelInstanceRoutingTestBean(channelRegistry);
Method routingMethod = testBean.getClass().getMethod("routePayload", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestChannelInstanceResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestChannelInstanceResolutionByPayload(handler, channelRegistry);
}
@Test
public void testChannelInstanceResolutionByPayloadConfiguredByMethodName() {
public void channelInstanceResolutionByPayloadConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
SingleChannelInstanceRoutingTestBean testBean = new SingleChannelInstanceRoutingTestBean(channelRegistry);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routePayload");
this.doTestChannelInstanceResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routePayload");
this.doTestChannelInstanceResolutionByPayload(handler, channelRegistry);
}
private void doTestChannelInstanceResolutionByPayload(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
channelRegistry.registerChannel("bar-channel", barChannel);
private void doTestChannelInstanceResolutionByPayload(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
MessageChannel fooChannel = new QueueChannel();
MessageChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
channelRegistry.registerChannel("bar-channel", barChannel);
Message<?> result1 = ((CompositeMessage) handler.handle(fooMessage)).getPayload().get(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
adapter.handle(barMessage);
Message<?> result2 = barChannel.receive(0);
assertEquals(fooChannel, result1.getHeaders().getNextTarget());
Message<?> result2 = ((CompositeMessage) handler.handle(barMessage)).getPayload().get(0);
assertNotNull(result2);
assertEquals("bar", result2.getPayload());
adapter.handle(badMessage);
Message<?> result3 = fooChannel.receive(0);
assertNull(result3);
Message<?> result4 = barChannel.receive(0);
assertNull(result4);
assertEquals(barChannel, result2.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
public void testChannelInstanceResolutionByMessageConfiguredByMethodReference() throws Exception {
public void channelInstanceResolutionByMessageConfiguredByMethodReference() throws Exception {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
SingleChannelInstanceRoutingTestBean testBean = new SingleChannelInstanceRoutingTestBean(channelRegistry);
Method routingMethod = testBean.getClass().getMethod("routeMessage", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestChannelInstanceResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestChannelInstanceResolutionByMessage(handler, channelRegistry);
}
@Test
public void testChannelInstanceResolutionByMessageConfiguredByMethodName() {
public void channelInstanceResolutionByMessageConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
SingleChannelInstanceRoutingTestBean testBean = new SingleChannelInstanceRoutingTestBean(channelRegistry);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessage");
this.doTestChannelInstanceResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessage");
this.doTestChannelInstanceResolutionByMessage(handler, channelRegistry);
}
private void doTestChannelInstanceResolutionByMessage(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestChannelInstanceResolutionByMessage(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -210,41 +190,35 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
Message<?> result1 = ((CompositeMessage) handler.handle(fooMessage)).getPayload().get(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
adapter.handle(barMessage);
Message<?> result2 = barChannel.receive(0);
assertEquals(fooChannel, result1.getHeaders().getNextTarget());
Message<?> result2 = ((CompositeMessage) handler.handle(barMessage)).getPayload().get(0);
assertNotNull(result2);
assertEquals("bar", result2.getPayload());
adapter.handle(badMessage);
Message<?> result3 = fooChannel.receive(0);
assertNull(result3);
Message<?> result4 = barChannel.receive(0);
assertNull(result4);
assertEquals(barChannel, result2.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
public void testMultiChannelNameResolutionByPayloadConfiguredByMethodReference() throws Exception {
public void multiChannelNameResolutionByPayloadConfiguredByMethodReference() throws Exception {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routePayload", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelNameResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelNameResolutionByPayload(handler, channelRegistry);
}
@Test
public void testMultiChannelNameResolutionByPayloadConfiguredByMethodName() {
public void multiChannelNameResolutionByPayloadConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routePayload");
this.doTestMultiChannelNameResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routePayload");
this.doTestMultiChannelNameResolutionByPayload(handler, channelRegistry);
}
private void doTestMultiChannelNameResolutionByPayload(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelNameResolutionByPayload(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -252,47 +226,45 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals("foo-channel", result1a.getHeaders().getNextTarget());
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals("bar-channel", result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals("foo-channel", result2a.getHeaders().getNextTarget());
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals("bar-channel", result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
public void testMultiChannelNameResolutionByMessageConfiguredByMethodReference() throws Exception {
public void multiChannelNameResolutionByMessageConfiguredByMethodReference() throws Exception {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeMessage", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelNameResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelNameResolutionByMessage(handler, channelRegistry);
}
@Test
public void testMultiChannelNameResolutionByMessageConfiguredByMethodName() throws Exception {
public void multiChannelNameResolutionByMessageConfiguredByMethodName() throws Exception {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessage");
this.doTestMultiChannelNameResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessage");
this.doTestMultiChannelNameResolutionByMessage(handler, channelRegistry);
}
private void doTestMultiChannelNameResolutionByMessage(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelNameResolutionByMessage(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -300,27 +272,25 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals("foo-channel", result1a.getHeaders().getNextTarget());
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals("bar-channel", result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals("foo-channel", result2a.getHeaders().getNextTarget());
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals("bar-channel", result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
@@ -328,19 +298,19 @@ public class RouterMessageHandlerAdapterTests {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeMessageToArray", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelNameArrayResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelNameArrayResolutionByMessage(handler, channelRegistry);
}
@Test
public void testMultiChannelNameArrayResolutionByMessageConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelNameRoutingTestBean testBean = new MultiChannelNameRoutingTestBean();
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessageToArray");
this.doTestMultiChannelNameArrayResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessageToArray");
this.doTestMultiChannelNameArrayResolutionByMessage(handler, channelRegistry);
}
private void doTestMultiChannelNameArrayResolutionByMessage(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelNameArrayResolutionByMessage(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -348,27 +318,25 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals("foo-channel", result1a.getHeaders().getNextTarget());
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals("bar-channel", result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals("foo-channel", result2a.getHeaders().getNextTarget());
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals("bar-channel", result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
@@ -376,19 +344,19 @@ public class RouterMessageHandlerAdapterTests {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
Method routingMethod = testBean.getClass().getMethod("routePayload", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelListResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelListResolutionByPayload(handler, channelRegistry);
}
@Test
public void testMultiChannelListResolutionByPayloadConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routePayload");
this.doTestMultiChannelListResolutionByPayload(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routePayload");
this.doTestMultiChannelListResolutionByPayload(handler, channelRegistry);
}
private void doTestMultiChannelListResolutionByPayload(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelListResolutionByPayload(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -396,27 +364,25 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals(fooChannel, result1a.getHeaders().getNextTarget());
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals(barChannel, result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals(fooChannel, result2a.getHeaders().getNextTarget());
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals(barChannel, result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
@@ -424,19 +390,19 @@ public class RouterMessageHandlerAdapterTests {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
Method routingMethod = testBean.getClass().getMethod("routeMessage", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelListResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelListResolutionByMessage(handler, channelRegistry);
}
@Test
public void testMultiChannelListResolutionByMessageConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessage");
this.doTestMultiChannelListResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessage");
this.doTestMultiChannelListResolutionByMessage(handler, channelRegistry);
}
private void doTestMultiChannelListResolutionByMessage(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelListResolutionByMessage(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -444,27 +410,25 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals(fooChannel, result1a.getHeaders().getNextTarget());
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals(barChannel, result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals(fooChannel, result2a.getHeaders().getNextTarget());
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals(barChannel, result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@Test
@@ -472,19 +436,19 @@ public class RouterMessageHandlerAdapterTests {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
Method routingMethod = testBean.getClass().getMethod("routeMessageToArray", Message.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
this.doTestMultiChannelArrayResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod);
this.doTestMultiChannelArrayResolutionByMessage(handler, channelRegistry);
}
@Test
public void testMultiChannelArrayResolutionByMessageConfiguredByMethodName() {
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
MultiChannelInstanceRoutingTestBean testBean = new MultiChannelInstanceRoutingTestBean(channelRegistry);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, "routeMessageToArray");
this.doTestMultiChannelArrayResolutionByMessage(adapter, channelRegistry);
RouterMessageHandler handler = new RouterMessageHandler(testBean, "routeMessageToArray");
this.doTestMultiChannelArrayResolutionByMessage(handler, channelRegistry);
}
private void doTestMultiChannelArrayResolutionByMessage(RouterMessageHandlerAdapter adapter, ChannelRegistry channelRegistry) {
private void doTestMultiChannelArrayResolutionByMessage(RouterMessageHandler handler, ChannelRegistry channelRegistry) {
QueueChannel fooChannel = new QueueChannel();
QueueChannel barChannel = new QueueChannel();
channelRegistry.registerChannel("foo-channel", fooChannel);
@@ -492,46 +456,25 @@ public class RouterMessageHandlerAdapterTests {
Message<String> fooMessage = new StringMessage("foo");
Message<String> barMessage = new StringMessage("bar");
Message<String> badMessage = new StringMessage("bad");
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(fooMessage);
Message<?> result1 = fooChannel.receive(0);
assertNotNull(result1);
assertEquals("foo", result1.getPayload());
Message<?> result2 = barChannel.receive(0);
assertNotNull(result2);
assertEquals("foo", result2.getPayload());
adapter.handle(barMessage);
Message<?> result3 = fooChannel.receive(0);
assertNotNull(result3);
assertEquals("bar", result3.getPayload());
Message<?> result4 = barChannel.receive(0);
assertNotNull(result4);
assertEquals("bar", result4.getPayload());
adapter.handle(badMessage);
Message<?> result5 = fooChannel.receive(0);
assertNull(result5);
Message<?> result6 = barChannel.receive(0);
assertNull(result6);
}
@Test
public void testChannelRegistryAwareTarget() throws Exception {
QueueChannel fooChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("foo-channel", fooChannel);
ChannelRegistryAwareTestBean testBean = new ChannelRegistryAwareTestBean();
Method routingMethod = testBean.getClass().getMethod("route", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
adapter.setChannelRegistry(channelRegistry);
assertNull(testBean.getChannelRegistry());
adapter.afterPropertiesSet();
assertNotNull(testBean.getChannelRegistry());
Message<String> message = new StringMessage("foo-channel");
adapter.handle(message);
Message<?> result = fooChannel.receive(0);
assertNotNull(result);
assertEquals("foo-channel", result.getPayload());
CompositeMessage reply1 = (CompositeMessage) handler.handle(fooMessage);
Message<?> result1a = reply1.getPayload().get(0);
Message<?> result1b = reply1.getPayload().get(1);
assertNotNull(result1a);
assertEquals("foo", result1a.getPayload());
assertEquals(fooChannel, result1a.getHeaders().getNextTarget());
assertNotNull(result1b);
assertEquals("foo", result1b.getPayload());
assertEquals(barChannel, result1b.getHeaders().getNextTarget());
CompositeMessage reply2 = (CompositeMessage) handler.handle(barMessage);
Message<?> result2a = reply2.getPayload().get(0);
Message<?> result2b = reply2.getPayload().get(1);
assertNotNull(result2a);
assertEquals("bar", result2a.getPayload());
assertEquals(fooChannel, result2a.getHeaders().getNextTarget());
assertNotNull(result2b);
assertEquals("bar", result2b.getPayload());
assertEquals(barChannel, result2b.getHeaders().getNextTarget());
assertNull(handler.handle(badMessage));
}
@@ -541,7 +484,7 @@ public class RouterMessageHandlerAdapterTests {
return name + "-channel";
}
public String routeByHeader(@Header("returnAddress") String name) {
public String routeByHeader(@Header("targetChannel") String name) {
return name + "-channel";
}