Router
Router Implementations
Since content-based routing often requires some domain-specific logic, most use-cases will require
Spring Integration's options for delegating to POJOs using the XML namespace support and/or Annotations.
Both of these are discussed below, but first we present a couple implementations that are available
out-of-the-box since they fulfill generic, but common, requirements.
PayloadTypeRouter
A PayloadTypeRouter will send Messages to the channel as defined by payload-type
mappings.
]]>
Configuration of PayloadTypeRouter is also supported via namespace support provided by Spring Integration (see ),
which essentially simplifies configuration by combining <router/> configuration and its corresponding implementation defined using <bean/> element
into a single and more concise configuration element.
Example below demonstrates PayloadTypeRouter configuration which is equivalent to the one above using Spring Integration namespace support:
]]>
RecipientListRouter
A RecipientListRouter will send each received Message to a statically-defined
list of Message Channels:
]]>
The router implementations share some common properties, such as "defaultOutputChannel" and "resolutionRequired".
If "resolutionRequired" is set to "true", and the router is unable to determine a target channel (e.g. there is
no matching payload for a PayloadTypeRouter and no "defaultOutputChannel" has been specified), then an Exception
will be thrown.
The <router> element
The "router" element provides a simple way to connect a router to an input channel, and also accepts the
optional default output channel. The "ref" may provide the bean name to one of the implementations described
above or a custom Router implementation (extending AbstractMessageRouter):
]]>
Alternatively, the "ref" may point to a simple Object that contains the @Router annotation (see below), or the
"ref" may be combined with an explicit "method" name. When specifying a "method", the same behavior applies as
described in the @Router annotation section below.
]]>
Using a "ref" attribute is generally recommended if the custom router implementation can be reused in other
<router> definitions. However if the custom router implementation should be scoped to a
concrete definition of the <router>, starting with v1.0.3, Spring Integration supports inner
bean definitions for custom routers within the <router> element:
]]>
Using both the "ref" attribute and an inner handler definition in the same <router> configuration
is not allowed, as it creates an ambiguous condition and will result in Exception being thrown.
The @Router Annotation
When using the @Router annotation, the annotated method can return either the
MessageChannel or String type. In the case of the latter,
the endpoint will resolve the channel name as it does for the default output. Additionally, the method can return
either a single value or a collection. When a collection is returned, the reply message will be sent to multiple
channels. To summarize, the following method signatures are all valid.
@Router
public MessageChannel route(Message message) {...}
@Router
public List<MessageChannel> route(Message message) {...}
@Router
public String route(Foo payload) {...}
@Router
public List<String> route(Foo payload) {...}
In addition to payload-based routing, a common requirement is to route based on metadata available within the
message header as either a property or attribute. Rather than requiring use of the
Message type as the method parameter, the @Router
annotation may also use the @Header parameter annotation that is documented in section .
@Router
public List<String> route(@Header("orderStatus") OrderStatus status)
For routing of XML-based Messages, including XPath support, see .