Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Fixed incorrect use of header expression.
Wiki Markup
h3. Routing Slip

The [Routing Slip|http://www.enterpriseintegrationpatterns.com/RoutingTable.html] from the [EIP patterns|Enterprise Integration Patterns] allows you to route a message consecutively through a series of processing steps where the sequence of steps is not known at design time and can vary for each message.

!http://www.enterpriseintegrationpatterns.com/img/RoutingTableSimple.gif!

h3. Options

{div:class=confluenceTableSmall}
|| Name || Default Value || Description ||
| {{uriDelimiter}} | {{,}} | Delimiter used if the [Expression] returned multiple endpoints. |
| {{ignoreInvalidEndpoints}} | {{false}} | If an endpoint uri could not be resolved, should it be ignored. Otherwise Camel will throw an exception stating the endpoint uri is not valid. |
{div}


h4. Example

The following route will take any messages sent to the [Apache ActiveMQ|http://activemq.apache.org] queue *SomeQueue* and pass them into the [Routing Slip|http://www.enterpriseintegrationpatterns.com/RoutingTable.html] pattern.

{code}
from("activemq:SomeQueue").routingSlip("headerNameaRoutingSlipHeader");
{code}

Messages will be checked for the existance of the "headerNameaRoutingSlipHeader" header. The value of this header should be a comma-delimited list of endpoint [URIs] you wish the message to be routed to. The [Message] will be routed in a [pipeline|Pipes and Filters] fashion (i.e. one after the other).

From Camel 2.5 the [Routing Slip] will set a property ({{Exchange.SLIP_ENDPOINT}}) on the [Exchange] which contains the current endpoint as it advanced though the slip. This allows you to _know_ how far we have processed in the slip.

The [Routing Slip] will compute the slip *beforehand* which means, the slip is only computed once. If you need to compute the slip _on-the-fly_ then use the [Dynamic Router] pattern instead.

h4. Configuration options

Here we set the header name and the URI delimiter to something different.

*Using the [Fluent Builders]*
{snippet:id=e3|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipTest.java}

*Using the [Spring XML Extensions]*
{code}
<camelContext id="buildRoutingSlip" xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:c"/>
    <routingSlip headerName="aRoutingSlipHeader" uriDelimiter="#"/>>
       <header>aRoutingSlipHeader</header>
    </routingSlip>
  </route>
</camelContext>
{code}

h3. Ignore invalid endpoints
*Available as of Camel 2.3*

The [Routing Slip] now supports {{ignoreInvalidEndpoints}} which the [Recipient List] also supports. You can use it to skip endpoints which are invalid.

{code}
    from("direct:a").routingSlip("myHeader").ignoreInvalidEndpoints();
{code}

And in Spring XML its an attribute on the recipient list tag.

{code}
   <route>
       <from uri="direct:a"/>
       <routingSlip headerName="myHeader" ignoreInvalidEndpoints="true"/>
         <header>myHeader</header>
      </routingSlip>
   </route>
{code}

Then lets say the {{myHeader}} contains the following two endpoints {{direct:foo,xxx:bar}}. The first endpoint is valid and works. However the 2nd is invalid and will just be ignored. Camel logs at INFO level, so you can see why the endpoint was invalid.

h3. Expression supporting
*Available as of Camel 2.4*

The [Routing Slip] now supports to take the expression parameter as the [Recipient List] does. You can tell Camel the expression that you want to use to get the routing slip.

{code}
    from("direct:a").routingSlip(header("myHeader")).ignoreInvalidEndpoints();
{code}

And in Spring XML its an attribute on the recipient list tag.

{code}
   <route>
       <from uri="direct:a"/>
       <!--NOTE from Camel 2.4.0, you need to specify the expression element inside of the routingSlip element -->
       <routingSlip ignoreInvalidEndpoints="true">
           <header>myHeader</header>
       </routingSlip>
   </route>
{code}

h4. Further Examples

For further examples of this pattern in use you could look at the [routing slip test cases|http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/routingslip].

{include:Using This Pattern}