resolves INT-582
Includes refactoring of router hierarchy to avoid duplication of channel resolution logic Subclasses of AbstractChannelNameResolvingMessageRouter can return MessageChannel , MessageChannel[], collection ... in addition to String MethodInvokingRouter now extends AbstractChannelNameResolvingMessageRouter and is simplified as a result
This commit is contained in:
@@ -25,11 +25,10 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.integration.annotation.Header;
|
||||
import org.springframework.integration.channel.ChannelResolver;
|
||||
import org.springframework.integration.channel.TestChannelResolver;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.channel.TestChannelResolver;
|
||||
import org.springframework.integration.core.Message;
|
||||
import org.springframework.integration.core.MessageChannel;
|
||||
import org.springframework.integration.core.MessagingException;
|
||||
|
||||
@@ -19,13 +19,15 @@ package org.springframework.integration.router;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import org.junit.Test;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.channel.TestChannelResolver;
|
||||
import org.springframework.integration.core.Message;
|
||||
import org.springframework.integration.core.MessagingException;
|
||||
import org.springframework.integration.message.StringMessage;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
@@ -35,8 +37,9 @@ public class MultiChannelRouterTests {
|
||||
@Test
|
||||
public void routeWithChannelMapping() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] {"channel1", "channel2"};
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return CollectionUtils.arrayToList(new String[] {"channel1", "channel2"});
|
||||
}
|
||||
};
|
||||
QueueChannel channel1 = new QueueChannel();
|
||||
@@ -60,8 +63,9 @@ public class MultiChannelRouterTests {
|
||||
@Test(expected = MessagingException.class)
|
||||
public void channelNameLookupFailure() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] {"noSuchChannel"};
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return CollectionUtils.arrayToList(new String[] {"noSuchChannel"} );
|
||||
}
|
||||
};
|
||||
TestChannelResolver channelResolver = new TestChannelResolver();
|
||||
@@ -73,8 +77,9 @@ public class MultiChannelRouterTests {
|
||||
@Test(expected = MessagingException.class)
|
||||
public void channelMappingNotAvailable() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] {"noSuchChannel"};
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return CollectionUtils.arrayToList(new String[] {"noSuchChannel"});
|
||||
}
|
||||
};
|
||||
Message<String> message = new StringMessage("test");
|
||||
|
||||
@@ -18,11 +18,11 @@ package org.springframework.integration.router;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.support.GenericApplicationContext;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.channel.TestChannelResolver;
|
||||
@@ -31,6 +31,7 @@ import org.springframework.integration.core.MessageChannel;
|
||||
import org.springframework.integration.core.MessagingException;
|
||||
import org.springframework.integration.message.MessageDeliveryException;
|
||||
import org.springframework.integration.message.StringMessage;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
@@ -86,7 +87,7 @@ public class RouterTests {
|
||||
@Test
|
||||
public void nullChannelNameArrayIgnoredByDefault() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
@@ -99,7 +100,7 @@ public class RouterTests {
|
||||
@Test(expected = MessageDeliveryException.class)
|
||||
public void nullChannelNameArrayThrowsExceptionWhenResolutionRequired() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
@@ -114,8 +115,8 @@ public class RouterTests {
|
||||
@Test
|
||||
public void emptyChannelNameArrayIgnoredByDefault() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] {};
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return new ArrayList<Object>();
|
||||
}
|
||||
};
|
||||
TestChannelResolver channelResolver = new TestChannelResolver();
|
||||
@@ -127,8 +128,9 @@ public class RouterTests {
|
||||
@Test(expected = MessageDeliveryException.class)
|
||||
public void emptyChannelNameArrayThrowsExceptionWhenResolutionRequired() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] {};
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return CollectionUtils.arrayToList(new String[] {});
|
||||
}
|
||||
};
|
||||
TestChannelResolver channelResolver = new TestChannelResolver();
|
||||
@@ -151,8 +153,9 @@ public class RouterTests {
|
||||
@Test(expected = MessagingException.class)
|
||||
public void channelMappingIsRequiredWhenResolvingChannelNamesWithMultiChannelRouter() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] { "notImportant" };
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message){
|
||||
return CollectionUtils.arrayToList(new String[] { "notImportant" });
|
||||
}
|
||||
};
|
||||
router.handleMessage(new StringMessage("this should fail"));
|
||||
@@ -177,8 +180,9 @@ public class RouterTests {
|
||||
@Test
|
||||
public void beanFactoryWithMultiChannelRouter() {
|
||||
AbstractChannelNameResolvingMessageRouter router = new AbstractChannelNameResolvingMessageRouter() {
|
||||
public String[] determineTargetChannelNames(Message<?> message) {
|
||||
return new String[] { "testChannel" };
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Object> getChannelIndicatorList(Message<?> message) {
|
||||
return CollectionUtils.arrayToList(new String[] { "testChannel" });
|
||||
}
|
||||
};
|
||||
QueueChannel testChannel = new QueueChannel();
|
||||
|
||||
@@ -24,17 +24,19 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.integration.annotation.Router;
|
||||
import org.springframework.integration.channel.PollableChannel;
|
||||
import org.springframework.integration.core.Message;
|
||||
import org.springframework.integration.core.MessageChannel;
|
||||
import org.springframework.integration.message.GenericMessage;
|
||||
import org.springframework.integration.message.MessageDeliveryException;
|
||||
import org.springframework.integration.message.StringMessage;
|
||||
import org.springframework.integration.router.AbstractMessageRouter;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
* @author Jonas Partner
|
||||
*/
|
||||
public class RouterParserTests {
|
||||
|
||||
@@ -97,7 +99,25 @@ public class RouterParserTests {
|
||||
assertNotNull(result);
|
||||
assertEquals("test-annotation", result.getPayload());
|
||||
}
|
||||
|
||||
@Test(expected=MessageDeliveryException.class)
|
||||
public void testResolutionRequired() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"routerParserTests.xml", this.getClass());
|
||||
context.start();
|
||||
MessageChannel input = (MessageChannel) context.getBean("inputForRouterRequiringResolution");
|
||||
input.send(new GenericMessage<Integer>(3));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testIgnoreChannelNameResolutionFailures() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"routerParserTests.xml", this.getClass());
|
||||
context.start();
|
||||
MessageChannel input = (MessageChannel) context.getBean("ignoreChannelNameResolutionFailuresInput");
|
||||
input.send(new StringMessage("channelThatDoesNotExist"));
|
||||
}
|
||||
|
||||
public static class TestRouterImplementation extends AbstractMessageRouter {
|
||||
|
||||
@@ -127,5 +147,16 @@ public class RouterParserTests {
|
||||
return this.channel;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ReturnStringPassedInAsChannelNameRouter {
|
||||
|
||||
@Router
|
||||
public String route(Message<?> message) {
|
||||
return (String)message.getPayload();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -54,5 +54,14 @@
|
||||
<beans:bean id="annotated" class="org.springframework.integration.router.config.RouterParserTests$AnnotatedTestRouterBean">
|
||||
<beans:constructor-arg ref="output4"/>
|
||||
</beans:bean>
|
||||
|
||||
<channel id="inputForRouterRequiringResolution"/>
|
||||
|
||||
<router id="resolutionRequiredRouter" ref="pojo" method="route" input-channel="inputForRouterRequiringResolution" resolution-required="true" />
|
||||
|
||||
<channel id="ignoreChannelNameResolutionFailuresInput"/>
|
||||
<beans:bean id="payloadAsChannelNameRouter" class="org.springframework.integration.router.config.RouterParserTests$ReturnStringPassedInAsChannelNameRouter" />
|
||||
<router id="ignoreChannelNameResolutionFailuresRouter" ref="payloadAsChannelNameRouter" input-channel="ignoreChannelNameResolutionFailuresInput" ignore-channel-name-resolution-failures="true" />
|
||||
|
||||
|
||||
</beans:beans>
|
||||
|
||||
Reference in New Issue
Block a user