Apache Camel conditional routing

33,500

Solution 1

The information of the operation required will be in the header of the message.

The header you are looking for is called 'operationName'

So here is an example :

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="example">
        <from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />
        <log message="The expected operation is :: ${headers.operationName}" />
        <choice>
            <when>
                <simple>${headers.operationName} == 'RegisterUser'</simple>
                    <bean ref="processor" method="processMessage"/>
                <to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
            </when>
            <when>
                <simple>${headers.operationName} == 'UpdateUser'</simple>
                <!-- Do the update user logic here -->
                <bean ref="processor" method="updateUser" />
            </when>
        </choice>
    <to uri="cxf:bean:myTargetEndpoint"/>
    </route>
</camelContext> 

(Note the example is using apache aries blueprint - but it will be identical for spring, other than the namespace)

Solution 2

try using camel-simple expressions instead of xpath for this...

<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when>
Share:
33,500
Paulius Matulionis
Author by

Paulius Matulionis

Check some of my posts at: http://pauliusmatulionis.blogspot.co.uk/

Updated on July 09, 2022

Comments

  • Paulius Matulionis
    Paulius Matulionis almost 2 years

    I have a service which has two operations.

    RegisterUser
    UpdateUser
    

    I have a camel rout:

    <camel:route id="myRoute">
        <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />            
        <camel:bean ref="processor" method="processMessage"/>
        <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
        <camel:to uri="cxf:bean:myTargetEndpoint"/>
    </camel:route>
    

    In my processor bean, when I specify:

    RegisterUser registerUser = exchange.getIn().getBody(RegisterUser.class);
    

    I get the register user object. Everything works fine. The problem is that I want camel to route my request conditionally, for e.g:

    If the service operation is RegisterUser I want to route the message to my specific bean and if the service operation is UpdateUser I want to route the message to the other bean.

    I have tried to use camel xPath, but it not seems to be working.

    <camel:route id="myRoute">
        <camel:from uri="cxf:bean:myListenerEndpoint?dataFormat=POJO&amp;synchronous=true" />  
        <camel:choice>
            <camel:when>
                <camel:xpath>
                    //RegisterUser
                </camel:xpath>
                <camel:bean ref="processor" method="processMessage"/>
                <camel:to uri="xslt:file:resources/service/2.0.0/UserRegistration.xsl"/>
            </camel:when>
        </camel:choice>                        
        <camel:to uri="cxf:bean:myTargetEndpoint"/>
    </camel:route>
    

    I was searching how to set up camel to route to the different targets but did not find anything. Maybe somebody knows where might be the problem?

  • Paulius Matulionis
    Paulius Matulionis almost 12 years
    This works great for me. Exactly what I needed. Thank you! :)
  • Eduardo Baitello
    Eduardo Baitello over 4 years
    Code-only answers are generally frowned upon on this site. Could you please edit your answer to include some comments or explanation of your code? Explanations should answer questions like: What does it do? How does it do it? Where does it go? How does it solve OP's problem? See: How to anwser. Thanks!