A recipient list, shown in Figure 5.3, is a type of router that sends each incoming message to multiple different destinations. In addition, a recipient list typically requires that the list of recipients be calculated at run time.
The simplest kind of recipient list is where the list of destinations is fixed and known
in advance, and the exchange pattern is InOnly. In this case, you can
hardwire the list of destinations into the to()
Java DSL command.
The following example shows how to route an InOnly exchange from a
consumer endpoint, queue:a
, to a fixed list of destinations:
from("seda:a").to("seda:b", "seda:c", "seda:d");
The following example shows how to configure the same route in XML:
<camelContext id="buildStaticRecipientList" xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="seda:a"/> <to uri="seda:b"/> <to uri="seda:c"/> <to uri="seda:d"/> </route> </camelContext>
In most cases, when you use the recipient list pattern, the list of recipients should be
calculated at runtime. To do this use the recipientList()
processor, which takes a list of destinations as its sole argument. Because FUSE Mediation Router applies
a type converter to the list argument, it should be possible to use most standard Java list
types (for example, a collection, a list, or an array). For more details about type
converters, see Built-In Type Converters in
The following example shows how to extract the list of destinations from a message
header called recipientListHeader
, where the header value is a comma-separated
list of endpoint URIs:
from("direct:a").recipientList(header("recipientListHeader").tokenize(","));
In some cases, if the header value is a list type, you might be able to use it directly
as the argument to recipientList()
. For example:
from("seda:a").recipientList(header("recipientListHeader"));
However, this example is entirely dependent on how the underlying component parses this particular header. If the component parses the header as a simple string, this example will not work. You must know how the underlying component parses its header data (see ????).
The following example shows how to configure the preceding route in XML, where it is
assumed that the underlying component parses the foo
header as a list
type:
<camelContext id="buildDynamicRecipientList" xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="seda:a"/> <recipientList> <header>recipientListHeader</header> </recipientList> </route> </camelContext>