Class AbstractMappingMessageRouter
java.lang.Object
org.springframework.integration.context.IntegrationObjectSupport
org.springframework.integration.handler.MessageHandlerSupport
org.springframework.integration.handler.AbstractMessageHandler
org.springframework.integration.router.AbstractMessageRouter
org.springframework.integration.router.AbstractMappingMessageRouter
- All Implemented Interfaces:
org.reactivestreams.Subscriber<Message<?>>
,Aware
,BeanFactoryAware
,BeanNameAware
,DisposableBean
,InitializingBean
,ApplicationContextAware
,Ordered
,ExpressionCapable
,Orderable
,IntegrationPattern
,MessageRouter
,NamedComponent
,IntegrationManagement
,MappingMessageRouterManagement
,TrackableComponent
,MessageHandler
,reactor.core.CoreSubscriber<Message<?>>
- Direct Known Subclasses:
ErrorMessageExceptionTypeRouter
,ExpressionEvaluatingRouter
,HeaderValueRouter
,MethodInvokingRouter
,PayloadTypeRouter
,XPathRouter
public abstract class AbstractMappingMessageRouter
extends AbstractMessageRouter
implements MappingMessageRouterManagement
Base class for all Message Routers that support mapping from arbitrary String values
to Message Channel names.
- Since:
- 2.1
- Author:
- Mark Fisher, Oleg Zhurakousky, Gunnar Hillert, Gary Russell, Artem Bilan, Trung Pham
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.springframework.integration.support.management.IntegrationManagement
IntegrationManagement.ManagementOverrides
-
Field Summary
Fields inherited from class org.springframework.integration.context.IntegrationObjectSupport
EXPRESSION_PARSER, logger
Fields inherited from interface org.springframework.integration.support.management.IntegrationManagement
METER_PREFIX, RECEIVE_COUNTER_NAME, SEND_TIMER_NAME
Fields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected Collection<MessageChannel>
determineTargetChannels
(Message<?> message) Subclasses must implement this method to return a Collection of zero or more MessageChannels to which the given Message should be routed.getChannelKeys
(Message<?> message) Subclasses must implement this method to return the channel keys.Returns an unmodifiable version of the channel mappings.Provide a collection of channel names to which we have routed messages where the channel was not explicitly mapped.protected void
onInit()
Subclasses may implement this for initialization logic.void
Remove a channel mapping for the given key if present.void
replaceChannelMappings
(Properties channelMappings) Convenience method allowing conversion of a list of mappings in a control-bus message.void
setChannelKeyFallback
(boolean channelKeyFallback) When true (default), if a resolved channel key does not exist in the channel map, the key itself is used as the channel name, which we will attempt to resolve to a channel.void
setChannelMapping
(String key, String channelName) Add a channel mapping from the provided key to channel name.void
setChannelMappings
(Map<String, String> channelMappings) Provide mappings from channel keys to channel names.void
setDefaultOutputChannel
(MessageChannel defaultOutputChannel) Set the default channel where Messages should be sent if channel resolution fails to return any channels.void
setDefaultOutputChannelName
(String defaultOutputChannelName) Set the default channel where Messages should be sent if channel resolution fails to return any channels.void
setDynamicChannelLimit
(int dynamicChannelLimit) Set a limit for how many dynamic channels are retained (for reporting purposes).void
Specify a prefix to be added to each channel name prior to resolution.void
setResolutionRequired
(boolean resolutionRequired) Specify whether this router should ignore any failure to resolve a channel name to an actual MessageChannel instance when delegating to the ChannelResolver strategy.void
Specify a suffix to be added to each channel name prior to resolution.Methods inherited from class org.springframework.integration.router.AbstractMessageRouter
getComponentType, getDefaultOutputChannel, getIntegrationPatternType, getMessagingTemplate, getRequiredConversionService, handleMessageInternal, setApplySequence, setIgnoreSendFailures, setSendTimeout
Methods inherited from class org.springframework.integration.handler.AbstractMessageHandler
handleMessage, onComplete, onError, onNext, onSubscribe, setObservationConvention
Methods inherited from class org.springframework.integration.handler.MessageHandlerSupport
buildSendTimer, destroy, getManagedName, getManagedType, getMetricsCaptor, getObservationRegistry, getOrder, getOverrides, isLoggingEnabled, isObserved, registerMetricsCaptor, registerObservationRegistry, sendTimer, setLoggingEnabled, setManagedName, setManagedType, setOrder, setShouldTrack, shouldTrack
Methods inherited from class org.springframework.integration.context.IntegrationObjectSupport
afterPropertiesSet, extractTypeIfPossible, generateId, getApplicationContext, getApplicationContextId, getBeanDescription, getBeanFactory, getBeanName, getChannelResolver, getComponentName, getConversionService, getExpression, getIntegrationProperties, getIntegrationProperty, getMessageBuilderFactory, getTaskScheduler, isInitialized, setApplicationContext, setBeanFactory, setBeanName, setChannelResolver, setComponentName, setConversionService, setMessageBuilderFactory, setPrimaryExpression, setTaskScheduler, toString
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface reactor.core.CoreSubscriber
currentContext
Methods inherited from interface org.springframework.integration.support.management.IntegrationManagement
getThisAs
Methods inherited from interface org.springframework.integration.support.context.NamedComponent
getBeanName, getComponentName
-
Constructor Details
-
AbstractMappingMessageRouter
public AbstractMappingMessageRouter()
-
-
Method Details
-
setChannelMappings
Provide mappings from channel keys to channel names. Channel names will be resolved by theDestinationResolver
.- Specified by:
setChannelMappings
in interfaceMappingMessageRouterManagement
- Parameters:
channelMappings
- The channel mappings.
-
setPrefix
Specify a prefix to be added to each channel name prior to resolution.- Parameters:
prefix
- The prefix.
-
setSuffix
Specify a suffix to be added to each channel name prior to resolution.- Parameters:
suffix
- The suffix.
-
setResolutionRequired
public void setResolutionRequired(boolean resolutionRequired) Specify whether this router should ignore any failure to resolve a channel name to an actual MessageChannel instance when delegating to the ChannelResolver strategy.- Parameters:
resolutionRequired
- true if resolution is required.
-
setChannelKeyFallback
public void setChannelKeyFallback(boolean channelKeyFallback) When true (default), if a resolved channel key does not exist in the channel map, the key itself is used as the channel name, which we will attempt to resolve to a channel. Set tofalse
to disable this feature. This could be useful to prevent malicious actors from generating a message that could cause the message to be routed to an unexpected channel, such as one upstream of the router, which would cause a stack overflow.- Parameters:
channelKeyFallback
- false to disable the fallback.- Since:
- 5.2
-
setDefaultOutputChannel
Set the default channel where Messages should be sent if channel resolution fails to return any channels. It also setschannelKeyFallback
tofalse
to avoid an attempt to resolve a channel from its key, but instead send the message directly to this channel. IfchannelKeyFallback
is set explicitly totrue
, the logic depends on theresolutionRequired
option (true
by default), and therefore a fallback to this default output channel may never happen. The configuration where a default output channel is present andresolutionRequired
andchannelKeyFallback
are set totrue
is rejected since it leads to ambiguity.- Overrides:
setDefaultOutputChannel
in classAbstractMessageRouter
- Parameters:
defaultOutputChannel
- The default output channel.- Since:
- 6.0
- See Also:
-
setDefaultOutputChannelName
Set the default channel where Messages should be sent if channel resolution fails to return any channels. It also setschannelKeyFallback
tofalse
to avoid an attempt to resolve a channel from its key, but instead send the message directly to this channel. IfchannelKeyFallback
is set explicitly totrue
, the logic depends on theresolutionRequired
option (true
by default), and therefore a fallback to this default output channel may never happen. The configuration where a default output channel is present andresolutionRequired
andchannelKeyFallback
are set totrue
is rejected since it leads to ambiguity.- Overrides:
setDefaultOutputChannelName
in classAbstractMessageRouter
- Parameters:
defaultOutputChannelName
- the name of the channel bean for default output.- Since:
- 6.0
- See Also:
-
setDynamicChannelLimit
public void setDynamicChannelLimit(int dynamicChannelLimit) Set a limit for how many dynamic channels are retained (for reporting purposes). When the limit is exceeded, the oldest channel is discarded.NOTE: this does not affect routing, just the reporting which dynamically resolved channels have been routed to. Default
100
.- Parameters:
dynamicChannelLimit
- the limit.- See Also:
-
getChannelMappings
Returns an unmodifiable version of the channel mappings. This is intended for use by subclasses only.- Specified by:
getChannelMappings
in interfaceMappingMessageRouterManagement
- Returns:
- The channel mappings.
-
setChannelMapping
Add a channel mapping from the provided key to channel name.- Specified by:
setChannelMapping
in interfaceMappingMessageRouterManagement
- Parameters:
key
- The key.channelName
- The channel name.
-
removeChannelMapping
Remove a channel mapping for the given key if present.- Specified by:
removeChannelMapping
in interfaceMappingMessageRouterManagement
- Parameters:
key
- The key.
-
getDynamicChannelNames
Description copied from interface:MappingMessageRouterManagement
Provide a collection of channel names to which we have routed messages where the channel was not explicitly mapped.Implementations may choose to return only the most recent channel names.
- Specified by:
getDynamicChannelNames
in interfaceMappingMessageRouterManagement
- Returns:
- a collection of channel names to which we have routed messages where the channel was not explicitly mapped.
-
onInit
protected void onInit()Description copied from class:IntegrationObjectSupport
Subclasses may implement this for initialization logic.- Overrides:
onInit
in classAbstractMessageRouter
-
determineTargetChannels
Description copied from class:AbstractMessageRouter
Subclasses must implement this method to return a Collection of zero or more MessageChannels to which the given Message should be routed.- Specified by:
determineTargetChannels
in classAbstractMessageRouter
- Parameters:
message
- The message.- Returns:
- The collection of message channels.
-
getChannelKeys
Subclasses must implement this method to return the channel keys. A "key" might be present in this router's "channelMappings", or it could be the channel's name or even the Message Channel instance itself.- Parameters:
message
- The message.- Returns:
- The channel keys.
-
replaceChannelMappings
Convenience method allowing conversion of a list of mappings in a control-bus message.This is intended to be called via a control-bus; keys and values that are not Strings will be ignored.
Mappings must be delimited with newlines, for example:
"@'myRouter.handler'.replaceChannelMappings('foo=qux \n baz=bar')"
.- Specified by:
replaceChannelMappings
in interfaceMappingMessageRouterManagement
- Parameters:
channelMappings
- The channel mappings.- Since:
- 4.0
-