This tutorial shows how to add a content-based router with logging to a route.
In this tutorial you will:
Configure the content-based router
To complete this tutorial you will need the CBRroute project you created in To Create a New Route.
To add and configure a content-based router for your route:
CBRroute/src/main/resources/OSGI-INF/blueprint/blueprint.xml to
open your CBRroute project.To_Others node and then select
the trash can above and to the right to delete it.In the Palette, open the Routing
drawer and drag a Choice (
) pattern to the canvas and drop it in the
Route_route1 container.
The Route_route1 container expands to accommodate the
Choice_choice1 node.
In the Route_route1 container, select the
From_from1 node
and drag its connector arrow over the Choice_choice1 node,
then release it:

In the Properties view, _choice1
appears in the Id field:

Leave the Id field as is.
From the Routing drawer, drag a When (
) pattern to the canvas and drop it on the
Choice_choice1 node:

The Choice_choice1 container expands to accommodate the
When_when1 node. The
decorating the When_when1 node
indicates that one or more required property values must be set.
![]() | Note |
|---|---|
The tooling prevents you from dropping a pattern at an invalid drop point in a Route container. |
On the canvas, select the When_when1 node, to open its
properties in the Properties view:

Click the
button in the Language field to open
the list of available languages, and select
xpath:

![]() | Note |
|---|---|
Once you select the expression Language, the
Properties view displays its properties in an
indented list directly below the Language field. The
Id property in this list sets the ID of the
expression. The Id property following the
Description field sets the ID of the
|
In the Expression field, enter
/order/orderline/quantity/text() >
/order/orderline/maxAllowed/text().
This expression determines which messages will transit this path in the route.
Leave each of the remaining properties as is.
Enabling Trim removes any leading or trailing white spaces and line breaks from the message.
Click the Source tab to view the XML for the route:

To add logging to your route:
) component.Drag the Log component to the canvas and drop it on
the When_when1 node:

The When_when1 container expands to accommodate the
Log_log1 node.
Log_log1 node to open its properties in the
Properties view.In the Message field, enter quantity requested
exceeds the maximum allowed - contact customer:

Leave each of the remaining properties as is.
![]() | Note |
|---|---|
In the Fuse Integration perspective’s Messages view, the tooling inserts the contents of the log node’s Id field in the Trace Node Id column for message instances, when tracing is enabled on the route (see To Trace a Message Through a Route). In the Console, it adds the contents of the log node’s Message field to the log data whenever the route runs. |
To add and configure message headers:
) pattern.Drag the Set Header pattern to the canvas and drop it in
the When_when1 container.
The When_when1 container expands to accommodate the
SetHeader_setHeader1 node.
On the canvas, select the Log_log1 node and drag its connector arrow over
the SetHeader_setHeader1 node, and then release it:

On the canvas, select the SetHeader_setHeader1 node to open its
properties in the Properties view:

Click the
button in the Language field to open
the list of available languages, and select
constant:

InvalidOrders.Destination.
) component.Drag the File component to the canvas and drop it
in the When_when1 container.
The When_when1 container expands to accommodate the
To_to1 node.
On the canvas, select the SetHeader_setHeader1 node and drag its
connector arrow over the To_to1 node, and then release
it:

On the canvas, select the To_to1 node to open its properties in the
Properties view:

On the Details tab, replace
directoryName with
target/messages/invalidOrders in the
Uri field, and enter _Invalid in
the Id field:

Click the Source tab to view the XML for the route:

To add and configure the otherwise branch of your route:
) pattern.Drag the Otherwise pattern to the canvas and drop
it into the Choice_choice1 container:

The Choice_choice1 container expands to accommodate the
Otherwise_otherwise1 node.
Otherwise_otherwise1 node to
open its properties in the Properties.In the Id field, enter _else2:

![]() | Note |
|---|---|
The |
) component.Drag the Log component to the canvas and drop it on
the Otherwise_else2 node:

The Otherwise-else2 container expands to accommodate the
Log_log2 node.
Log_log2 node to open its properties in
the Properties view.In the Message field, enter valid order -
process:

Leave each of the remaining properties as is.
Drag the Set Header pattern to the canvas and drop it into the
Otherwise_else2 container.
The Otherwise_else2 container expands to accommodate
the SetHeader_setHeader2 node.
On the canvas, select the Log_log2 node and drag its
connector arrow over the SetHeader_setHeader2 node, and
then release it:

![]() | Note |
|---|---|
You can collapse containers to free up space when the diagram becomes congested. To do so,
select the container you want to collapse, and then click its
![]() To reopen the container, select it and then click its
![]() Collapsing and expanding containers in the Design tab does not affect the routing context file. It remains unchanged. |
SetHeader_setHeader2 node to open its
properties in the Properties view.Click the
button in the Language field to open
the list of available languages, and select
constant:

Dispatcher.Destination.
) component.Drag the File component to the canvas and drop it into the
Otherwise_else2 container.
The Otherwise_else2 container expands to accommodate the
To_to1 node.
On the canvas, select the SetHeader_setHeader2 node, and drag its
connector arrow over the To_to1 node and then release
it:

To_to1 node to open its
properties in the Properties view.In the URI field, replace directoryName with
target/messages/validOrders, and in the
Id field, enter
_Valid:

On the menu bar, click > to save the routing context file.
This is the completed content-based router with logs and message headers:

Click the Source tab at the bottom, left of the canvas to display the XML for the route.
The camelContext element will look like that shown in Example 3, “XML for content-based router”.
Example 3. XML for content-based router
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://camel.apache.org/schema/blueprint
http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<camelContext id="_context1" xmlns="http://camel.apache.org/schema/blueprint">
<route id="_route1">
<from id="_from1" uri="file:src/data?noop=true"/>
<choice id="_choice1">
<when id="_when1">
<xpath>order/orderline/quantity/text() > /order/orderline/maxAllowed/text()</xpath>
<log id="_log1" message="quantity requested exceeds the maximum allowed - contact customer"/>
<setHeader headerName="Destination" id="_setHeader1">
<constant>InvalidOrders</constant>
</setHeader>
<to id="_Invalid" uri="file:target/messages/invalidOrders"/>
</when>
<otherwise id="_else2">
<log id="_log2" message="valid order - process"/>
<setHeader headerName="Destination" id="_setHeader2">
<constant>Dispatcher</constant>
</setHeader>
<to id="_Valid" uri="file:target/messages/validOrders"/>
</otherwise>
</choice>
</route>
</camelContext>
</blueprint>You can run the new route as described in Running the route.
After you run it, you can easily verify whether the route executed properly by checking the target destinations in Project Explorer:
CBRroute.Under the project root node
(CBRroute), locate the folder
target/messages/ and expand it.

Check that the target/messages/invalidOrders folder
contains message2.xml and
message4.xml.
In these messages, the value of the
quantity element should
exceed the value of the
maxAllowed
element.
Check that the target/messages/validOrders folder contains the four
message files that contain valid orders:
message1.xml,
message3.xml ,
message5.xml and
message6.xml.
In these messages, the value of the
quantity element should
be less than or equal to the value of the
maxAllowed
element.
![]() | Note |
|---|---|
To view message content, double-click each message to open it in the route editor’s XML editor. |
To learn more about message enrichment see: