Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
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

...

Image Removed

Example

The following route will take any messages sent to the Apache ActiveMQ queue SomeQueue and pass them into the Routing Slip pattern.

Code Block
.

!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 thrown 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("headerName");
{code}

Messages will be checked for the existance of the "headerName" 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).

...



*Note:* In Camel 1.x the default header name {{routingSlipHeader}} has been @deprecated and is removed in Camel 2.0. We feel that the DSL needed to express, the header it uses to locate the destinations, directly in the DSL to not confuse readers. So the header name must be provided.

...

 

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

...

Wiki Markup
 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 Block
]*
{code}
<camelContext id="buildRoutingSlip" xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:c"/>
    <routingSlip headerName="aRoutingSlipHeader" uriDelimiter="#"/>
  </route>
</camelContext>

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 is invalid.

Code Block
{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 is 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"/>
   </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 about, 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 the 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>

Further Examples

For further examples of this pattern in use you could look at the routing slip test cases.

...

{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}