The router hierarchy abstract method names are now 'determineTargetChannel', 'determineTargetChannelNames', etc (instead of "resolve..."). This clarifies the distinction between the target channel decision and the resolution of a channel *name* to a channel instance. The latter is now the responsibility of a ChannelResolver strategy, and all subclasses of AbstractChannelNameResolvingMessageRouter now delegate to a ChannelResolver after 'determineTargetChannelNames' has returned the channel name(s). In most cases, it will be a BeanFactoryChannelResolver.

This commit is contained in:
Mark Fisher
2008-10-12 17:58:36 +00:00
parent 0754889c5c
commit b34e416093
19 changed files with 71 additions and 59 deletions

View File

@@ -68,10 +68,10 @@ public abstract class AbstractChannelNameResolvingMessageRouter extends Abstract
}
@Override
protected final Collection<MessageChannel> resolveChannels(Message<?> message) {
protected final Collection<MessageChannel> determineTargetChannels(Message<?> message) {
this.afterPropertiesSet();
Collection<MessageChannel> channels = new ArrayList<MessageChannel>();
String[] channelNames = this.resolveChannelNames(message);
String[] channelNames = this.determineTargetChannelNames(message);
if (channelNames == null) {
return null;
}
@@ -99,6 +99,6 @@ public abstract class AbstractChannelNameResolvingMessageRouter extends Abstract
/**
* Subclasses must implement this method to return the channel name(s).
*/
protected abstract String[] resolveChannelNames(Message<?> message);
protected abstract String[] determineTargetChannelNames(Message<?> message);
}

View File

@@ -69,7 +69,7 @@ public abstract class AbstractMessageRouter extends AbstractMessageConsumer {
@Override
protected void onMessageInternal(Message<?> message) {
boolean sent = false;
Collection<MessageChannel> results = this.resolveChannels(message);
Collection<MessageChannel> results = this.determineTargetChannels(message);
if (results != null) {
for (MessageChannel channel : results) {
if (channel != null) {
@@ -94,6 +94,6 @@ public abstract class AbstractMessageRouter extends AbstractMessageConsumer {
* Subclasses must implement this method to return the target channels for
* a given Message.
*/
protected abstract Collection<MessageChannel> resolveChannels(Message<?> message);
protected abstract Collection<MessageChannel> determineTargetChannels(Message<?> message);
}

View File

@@ -19,16 +19,22 @@ package org.springframework.integration.router;
import org.springframework.integration.message.Message;
/**
* Extends {@link AbstractChannelNameResolvingMessageRouter} to support router
* implementations that always return a single channel name (or null).
*
* @author Mark Fisher
*/
public abstract class AbstractSingleChannelNameRouter extends AbstractChannelNameResolvingMessageRouter {
@Override
protected final String[] resolveChannelNames(Message<?> message) {
String channelName = this.resolveChannelName(message);
protected final String[] determineTargetChannelNames(Message<?> message) {
String channelName = this.determineTargetChannelName(message);
return (channelName != null) ? new String[] { channelName } : null;
}
protected abstract String resolveChannelName(Message<?> message);
/**
* Subclasses must implement this method to return the channel name.
*/
protected abstract String determineTargetChannelName(Message<?> message);
}

View File

@@ -23,16 +23,22 @@ import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
/**
* Extends {@link AbstractMessageRouter} to support router implementations that
* always return a single {@link MessageChannel} instance (or null).
*
* @author Mark Fisher
*/
public abstract class AbstractSingleChannelRouter extends AbstractMessageRouter {
@Override
protected final Collection<MessageChannel> resolveChannels(Message<?> message) {
MessageChannel channel = this.resolveChannel(message);
protected final Collection<MessageChannel> determineTargetChannels(Message<?> message) {
MessageChannel channel = this.determineTargetChannel(message);
return (channel != null) ? Collections.singletonList(channel) : null;
}
protected abstract MessageChannel resolveChannel(Message<?> message);
/**
* Subclasses must implement this method to return the target channel.
*/
protected abstract MessageChannel determineTargetChannel(Message<?> message);
}

View File

@@ -43,7 +43,7 @@ public class ErrorMessageExceptionTypeRouter extends AbstractSingleChannelRouter
@Override
protected MessageChannel resolveChannel(Message<?> message) {
protected MessageChannel determineTargetChannel(Message<?> message) {
MessageChannel channel = null;
Object payload = message.getPayload();
if (payload != null && (payload instanceof Throwable)) {

View File

@@ -67,7 +67,7 @@ public class MethodInvokingRouter extends AbstractMessageRouter implements Initi
}
@Override
protected final Collection<MessageChannel> resolveChannels(Message<?> message) {
protected final Collection<MessageChannel> determineTargetChannels(Message<?> message) {
Object result = this.invoker.invokeMethod(message);
if (result == null) {
return null;

View File

@@ -41,7 +41,7 @@ public class PayloadTypeRouter extends AbstractSingleChannelRouter {
}
@Override
protected MessageChannel resolveChannel(Message<?> message) {
protected MessageChannel determineTargetChannel(Message<?> message) {
return this.payloadTypeChannelMap.get(message.getPayload().getClass());
}

View File

@@ -46,7 +46,7 @@ public class RecipientListRouter extends AbstractMessageRouter implements Initia
}
@Override
protected Collection<MessageChannel> resolveChannels(Message<?> message) {
protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
return this.channels;
}