Apache Camel conditional routing
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&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>
Paulius Matulionis
Check some of my posts at: http://pauliusmatulionis.blogspot.co.uk/
Updated on July 09, 2022Comments
-
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&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 isUpdateUser
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&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 almost 12 yearsThis works great for me. Exactly what I needed. Thank you! :)
-
Eduardo Baitello over 4 yearsCode-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!