Search code examples
javaroutescxfapache-camelapache-karaf

Apache Camel conditional routing


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?


Solution

  • 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)