Apache Camel conditional routing

谁都会走 提交于 2019-11-27 17:59:16

问题


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?


回答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)




回答2:


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

<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when>



回答3:


Spring XML route In my case I use inbound Jetty EP. I check parametr in request. Invole URL http://localhost:8080/srv?alg=1

    <choice id="_choice1">
    <when id="_when1">
        <simple>${in.header.alg} == '1'</simple>
        <log id="_log10" message="LOG ALG 1"/>
    </when>
    ...
    <otherwise id="_otherwise1">
        <setFaultBody id="_setFaultBody1">
            <constant>Return message about ERROR</constant>
            </setFaultBody>
    </otherwise>
</choice>



回答4:


final CamelContext context = exchange.getContext();
if (isAlive) {
    context.startRoute("table-reader-route");
    log.info("starting dailycase route= " + response);
} else {
    context.stopRoute("table-reader-route");
    log.info("stoping dailycase route= " + response);
}


来源:https://stackoverflow.com/questions/11691074/apache-camel-conditional-routing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!