Simplified router hierarchy and only implementing ChannelRegistryAware for routers that resolve channel names.
This commit is contained in:
@@ -19,28 +19,52 @@ package org.springframework.integration.router;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.springframework.integration.channel.ChannelRegistry;
|
||||
import org.springframework.integration.channel.ChannelRegistryAware;
|
||||
import org.springframework.integration.channel.MessageChannel;
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessagingException;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A base class for {@link ChannelResolver} implementations that return only
|
||||
* the channel name(s) rather than {@link MessageChannel} instances.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public abstract class AbstractMultiChannelNameResolver extends AbstractChannelResolver {
|
||||
public abstract class AbstractChannelNameResolver implements ChannelResolver, ChannelRegistryAware {
|
||||
|
||||
@Override
|
||||
public Collection<MessageChannel> resolveChannels(Message<?> message) {
|
||||
private ChannelRegistry channelRegistry;
|
||||
|
||||
|
||||
public void setChannelRegistry(ChannelRegistry channelRegistry) {
|
||||
this.channelRegistry = channelRegistry;
|
||||
}
|
||||
|
||||
public final Collection<MessageChannel> resolveChannels(Message<?> message) {
|
||||
Collection<MessageChannel> channels = new ArrayList<MessageChannel>();
|
||||
String[] channelNames = this.resolveChannelNames(message);
|
||||
if (channelNames == null) {
|
||||
return null;
|
||||
}
|
||||
for (String channelName : channelNames) {
|
||||
MessageChannel channel = this.lookupChannel(channelName, true);
|
||||
channels.add(channel);
|
||||
if (channelName != null) {
|
||||
Assert.state(this.channelRegistry != null,
|
||||
"unable to resolve channels, no ChannelRegistry available");
|
||||
MessageChannel channel = this.channelRegistry.lookupChannel(channelName);
|
||||
if (channel == null) {
|
||||
throw new MessagingException(message,
|
||||
"unable to resolve chnanel '" + channelName + "'");
|
||||
}
|
||||
channels.add(channel);
|
||||
}
|
||||
}
|
||||
return channels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Subclasses must implement this method to return the channel name(s).
|
||||
*/
|
||||
protected abstract String[] resolveChannelNames(Message<?> message);
|
||||
|
||||
}
|
||||
@@ -1,56 +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.util.Collection;
|
||||
|
||||
import org.springframework.integration.ConfigurationException;
|
||||
import org.springframework.integration.channel.ChannelRegistry;
|
||||
import org.springframework.integration.channel.ChannelRegistryAware;
|
||||
import org.springframework.integration.channel.MessageChannel;
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessagingException;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public abstract class AbstractChannelResolver implements ChannelResolver, ChannelRegistryAware {
|
||||
|
||||
private volatile ChannelRegistry channelRegistry;
|
||||
|
||||
|
||||
public void setChannelRegistry(ChannelRegistry channelRegistry) {
|
||||
this.channelRegistry = channelRegistry;
|
||||
}
|
||||
|
||||
protected MessageChannel lookupChannel(String channelName, boolean required) {
|
||||
MessageChannel channel = null;
|
||||
if (channelName != null) {
|
||||
if (this.channelRegistry == null) {
|
||||
throw new ConfigurationException("unable to resolve channels, no ChannelRegistry available");
|
||||
}
|
||||
channel = this.channelRegistry.lookupChannel(channelName);
|
||||
}
|
||||
if (channel == null && required) {
|
||||
throw new MessagingException("unable to resolve channel '" + channelName + "'");
|
||||
}
|
||||
return channel;
|
||||
}
|
||||
|
||||
public abstract Collection<MessageChannel> resolveChannels(Message<?> message);
|
||||
|
||||
}
|
||||
@@ -16,18 +16,16 @@
|
||||
|
||||
package org.springframework.integration.router;
|
||||
|
||||
import org.springframework.integration.channel.MessageChannel;
|
||||
import org.springframework.integration.message.Message;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public abstract class AbstractSingleChannelNameResolver extends AbstractSingleChannelResolver {
|
||||
public abstract class AbstractSingleChannelNameResolver extends AbstractChannelNameResolver {
|
||||
|
||||
@Override
|
||||
protected MessageChannel resolveChannel(Message<?> message) {
|
||||
public final String[] resolveChannelNames(Message<?> message) {
|
||||
String channelName = this.resolveChannelName(message);
|
||||
return this.lookupChannel(channelName, true);
|
||||
return (channelName != null) ? new String[] { channelName } : null;
|
||||
}
|
||||
|
||||
protected abstract String resolveChannelName(Message<?> message);
|
||||
|
||||
@@ -25,7 +25,7 @@ import org.springframework.integration.message.Message;
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public abstract class AbstractSingleChannelResolver extends AbstractChannelResolver {
|
||||
public abstract class AbstractSingleChannelResolver implements ChannelResolver {
|
||||
|
||||
public Collection<MessageChannel> resolveChannels(Message<?> message) {
|
||||
MessageChannel channel = this.resolveChannel(message);
|
||||
|
||||
@@ -24,10 +24,13 @@ import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.integration.ConfigurationException;
|
||||
import org.springframework.integration.channel.ChannelRegistry;
|
||||
import org.springframework.integration.channel.ChannelRegistryAware;
|
||||
import org.springframework.integration.channel.MessageChannel;
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessageMappingMethodInvoker;
|
||||
import org.springframework.integration.message.MessagingException;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A {@link ChannelResolver} implementation that invokes the specified method
|
||||
@@ -37,10 +40,12 @@ import org.springframework.integration.message.MessagingException;
|
||||
*
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class MethodInvokingChannelResolver extends AbstractChannelResolver implements InitializingBean {
|
||||
public class MethodInvokingChannelResolver implements ChannelResolver, ChannelRegistryAware, InitializingBean {
|
||||
|
||||
private final MessageMappingMethodInvoker invoker;
|
||||
|
||||
private volatile ChannelRegistry channelRegistry;
|
||||
|
||||
|
||||
public MethodInvokingChannelResolver(Object object, Method method) {
|
||||
this.invoker = new MessageMappingMethodInvoker(object, method);
|
||||
@@ -51,11 +56,14 @@ public class MethodInvokingChannelResolver extends AbstractChannelResolver imple
|
||||
}
|
||||
|
||||
|
||||
public void setChannelRegistry(ChannelRegistry channelRegistry) {
|
||||
this.channelRegistry = channelRegistry;
|
||||
}
|
||||
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
this.invoker.afterPropertiesSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Collection<MessageChannel> resolveChannels(Message<?> message) {
|
||||
Object result = this.invoker.invokeMethod(message);
|
||||
if (result == null) {
|
||||
@@ -96,7 +104,13 @@ public class MethodInvokingChannelResolver extends AbstractChannelResolver imple
|
||||
channels.add((MessageChannel) channelOrName);
|
||||
}
|
||||
else if (channelOrName instanceof String) {
|
||||
MessageChannel channel = this.lookupChannel((String) channelOrName, true);
|
||||
String channelName = (String) channelOrName;
|
||||
Assert.state(this.channelRegistry != null,
|
||||
"ChannelRegistry is required for resolving channel names");
|
||||
MessageChannel channel = this.channelRegistry.lookupChannel(channelName);
|
||||
if (channel == null) {
|
||||
throw new MessagingException("unable to resolve channel '" + channelName + "'");
|
||||
}
|
||||
channels.add(channel);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -29,11 +29,11 @@ import org.springframework.util.Assert;
|
||||
* configured list of recipients. The recipients are provided as a list of
|
||||
* {@link MessageChannel} instances. For dynamic recipient lists, consider
|
||||
* either implementing the {@link ChannelResolver} interface directly or
|
||||
* extending the {@link AbstractMultiChannelNameResolver} base class.
|
||||
* extending the {@link AbstractChannelNameResolver} base class.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class RecipientListChannelResolver extends AbstractChannelResolver implements InitializingBean {
|
||||
public class RecipientListChannelResolver implements ChannelResolver, InitializingBean {
|
||||
|
||||
private volatile List<MessageChannel> channels;
|
||||
|
||||
@@ -47,7 +47,6 @@ public class RecipientListChannelResolver extends AbstractChannelResolver implem
|
||||
Assert.notEmpty(this.channels, "a non-empty channel list is required");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<MessageChannel> resolveChannels(Message<?> message) {
|
||||
return this.channels;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class MultiChannelRouterTests {
|
||||
public void routeWithChannelResolver() {
|
||||
final QueueChannel channel1 = new QueueChannel();
|
||||
final QueueChannel channel2 = new QueueChannel();
|
||||
AbstractChannelResolver channelResolver = new AbstractChannelResolver() {
|
||||
ChannelResolver channelResolver = new ChannelResolver() {
|
||||
public List<MessageChannel> resolveChannels(Message<?> message) {
|
||||
List<MessageChannel> channels = new ArrayList<MessageChannel>();
|
||||
channels.add(channel1);
|
||||
@@ -62,7 +62,7 @@ public class MultiChannelRouterTests {
|
||||
|
||||
@Test
|
||||
public void routeWithChannelNameResolver() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] {"channel1", "channel2"};
|
||||
}
|
||||
@@ -88,7 +88,7 @@ public class MultiChannelRouterTests {
|
||||
|
||||
@Test(expected = MessagingException.class)
|
||||
public void channelNameLookupFailure() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] {"noSuchChannel"};
|
||||
}
|
||||
@@ -102,7 +102,7 @@ public class MultiChannelRouterTests {
|
||||
|
||||
@Test(expected = MessagingException.class)
|
||||
public void channelRegistryNotAvailable() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] {"noSuchChannel"};
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ public class RouterEndpointTests {
|
||||
|
||||
@Test
|
||||
public void nullChannelNameArrayIgnoredByDefault() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return null;
|
||||
}
|
||||
@@ -100,7 +100,7 @@ public class RouterEndpointTests {
|
||||
|
||||
@Test(expected = MessageDeliveryException.class)
|
||||
public void nullChannelNameArrayThrowsExceptionWhenResolutionRequired() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return null;
|
||||
}
|
||||
@@ -116,7 +116,7 @@ public class RouterEndpointTests {
|
||||
|
||||
@Test
|
||||
public void emptyChannelNameArrayIgnoredByDefault() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] {};
|
||||
}
|
||||
@@ -130,7 +130,7 @@ public class RouterEndpointTests {
|
||||
|
||||
@Test(expected = MessageDeliveryException.class)
|
||||
public void emptyChannelNameArrayThrowsExceptionWhenResolutionRequired() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] {};
|
||||
}
|
||||
@@ -156,7 +156,7 @@ public class RouterEndpointTests {
|
||||
|
||||
@Test(expected = MessagingException.class)
|
||||
public void testChannelRegistryIsRequiredWhenUsingChannelNameResolverWithMultiChannelRouter() {
|
||||
AbstractMultiChannelNameResolver channelNameResolver = new AbstractMultiChannelNameResolver() {
|
||||
AbstractChannelNameResolver channelNameResolver = new AbstractChannelNameResolver() {
|
||||
public String[] resolveChannelNames(Message<?> message) {
|
||||
return new String[] { "notImportant" };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user