diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java index 930ef59dba..b81e8be60b 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/RouterParser.java @@ -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 getEndpointClass() { + return SimpleEndpoint.class; + } + @Override protected Class getHandlerAdapterClass() { - return RouterMessageHandlerAdapter.class; + return RouterMessageHandler.class; } } diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandler.java new file mode 100644 index 0000000000..c518fb1ed8 --- /dev/null +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandler.java @@ -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 channels = new ArrayList(); + 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> replies = new ArrayList>(); + 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); + } + +} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerAdapter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerAdapter.java deleted file mode 100644 index 46b6cfddde..0000000000 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerAdapter.java +++ /dev/null @@ -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); - } - -} diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerCreator.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerCreator.java index 06fc9734b9..86d0cf1e11 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerCreator.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/RouterMessageHandlerCreator.java @@ -30,7 +30,7 @@ import org.springframework.integration.handler.config.AbstractMessageHandlerCrea public class RouterMessageHandlerCreator extends AbstractMessageHandlerCreator { public MessageHandler doCreateHandler(Object object, Method method, Map attributes) { - return new RouterMessageHandlerAdapter(object, method); + return new RouterMessageHandler(object, method); } } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerAdapterTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerTests.java similarity index 52% rename from org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerAdapterTests.java rename to org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerTests.java index 8d79dfc9d0..cf0130c574 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerAdapterTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/RouterMessageHandlerTests.java @@ -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 message = new GenericMessage("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> 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 message = new GenericMessage("bar"); + Message reply = handler.handle(message); + assertNotNull(reply); + assertNotNull(reply); + assertEquals(CompositeMessage.class, reply.getClass()); + List> 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 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> 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("testing")); + RouterMessageHandler handler = new RouterMessageHandler(testBean, routingMethod); + handler.handle(new GenericMessage("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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 fooMessage = new StringMessage("foo"); Message barMessage = new StringMessage("bar"); Message 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 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"; }