Simplified router hierarchy and only implementing ChannelRegistryAware for routers that resolve channel names.

This commit is contained in:
Mark Fisher
2008-09-29 20:59:17 +00:00
parent 0c35a1781e
commit 590d346f08
9 changed files with 73 additions and 89 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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"};
}

View File

@@ -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" };
}