Class AbstractMappingMessageRouter

All Implemented Interfaces:
org.reactivestreams.Subscriber<Message<?>>, Aware, BeanFactoryAware, BeanNameAware, DisposableBean, InitializingBean, ApplicationContextAware, Ordered, ComponentSourceAware, 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, Ngoc Nhan
  • Constructor Details

    • AbstractMappingMessageRouter

      public AbstractMappingMessageRouter()
  • Method Details

    • setChannelMappings

      @ManagedAttribute public void setChannelMappings(Map<String,String> channelMappings)
      Provide mappings from channel keys to channel names. Channel names will be resolved by the DestinationResolver.
      Specified by:
      setChannelMappings in interface MappingMessageRouterManagement
      Parameters:
      channelMappings - The channel mappings.
    • setPrefix

      public void setPrefix(String prefix)
      Specify a prefix to be added to each channel name prior to resolution.
      Parameters:
      prefix - The prefix.
    • setSuffix

      public void setSuffix(String suffix)
      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 to false 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

      public void setDefaultOutputChannel(MessageChannel defaultOutputChannel)
      Set the default channel where Messages should be sent if channel resolution fails to return any channels. It also sets channelKeyFallback to false to avoid an attempt to resolve a channel from its key, but instead send the message directly to this channel. If channelKeyFallback is set explicitly to true, the logic depends on the resolutionRequired 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 and resolutionRequired and channelKeyFallback are set to true is rejected since it leads to ambiguity.
      Overrides:
      setDefaultOutputChannel in class AbstractMessageRouter
      Parameters:
      defaultOutputChannel - The default output channel.
      Since:
      6.0
      See Also:
    • setDefaultOutputChannelName

      public void setDefaultOutputChannelName(String defaultOutputChannelName)
      Set the default channel where Messages should be sent if channel resolution fails to return any channels. It also sets channelKeyFallback to false to avoid an attempt to resolve a channel from its key, but instead send the message directly to this channel. If channelKeyFallback is set explicitly to true, the logic depends on the resolutionRequired 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 and resolutionRequired and channelKeyFallback are set to true is rejected since it leads to ambiguity.
      Overrides:
      setDefaultOutputChannelName in class AbstractMessageRouter
      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

      @ManagedAttribute public Map<String,String> getChannelMappings()
      Returns an unmodifiable version of the channel mappings. This is intended for use by subclasses only.
      Specified by:
      getChannelMappings in interface MappingMessageRouterManagement
      Returns:
      The channel mappings.
    • setChannelMapping

      @ManagedOperation public void setChannelMapping(String key, String channelName)
      Add a channel mapping from the provided key to channel name.
      Specified by:
      setChannelMapping in interface MappingMessageRouterManagement
      Parameters:
      key - The key.
      channelName - The channel name.
    • removeChannelMapping

      @ManagedOperation public void removeChannelMapping(String key)
      Remove a channel mapping for the given key if present.
      Specified by:
      removeChannelMapping in interface MappingMessageRouterManagement
      Parameters:
      key - The key.
    • getDynamicChannelNames

      @ManagedAttribute public Collection<String> 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 interface MappingMessageRouterManagement
      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 class AbstractMessageRouter
    • determineTargetChannels

      protected Collection<MessageChannel> determineTargetChannels(Message<?> message)
      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 class AbstractMessageRouter
      Parameters:
      message - The message.
      Returns:
      The collection of message channels.
    • getChannelKeys

      protected abstract List<Object> getChannelKeys(Message<?> message)
      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

      @ManagedOperation public void replaceChannelMappings(Properties channelMappings)
      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 interface MappingMessageRouterManagement
      Parameters:
      channelMappings - The channel mappings.
      Since:
      4.0