Apache Camel条件路由

Pau*_*nis 10 java routing cxf apache-camel apache-karaf

我有一项服务,有两个操作.

RegisterUser
UpdateUser
Run Code Online (Sandbox Code Playgroud)

我有一个骆驼溃败:

<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>
Run Code Online (Sandbox Code Playgroud)

在我的处理器bean中,当我指定:

RegisterUser registerUser = exchange.getIn().getBody(RegisterUser.class);
Run Code Online (Sandbox Code Playgroud)

我得到了注册用户对象.一切正常.问题是我希望camel有条件地路由我的请求,例如:

如果服务操作是RegisterUser我想将消息路由到我的特定bean,如果服务操作是UpdateUser我想将消息路由到另一个bean.

我曾尝试使用camel xPath,但它似乎没有用.

<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>
Run Code Online (Sandbox Code Playgroud)

我正在寻找如何设置骆驼路线到不同的目标,但没有找到任何东西.也许有人知道问题出在哪里?

Ala*_*ter 19

所需操作的信息将在消息的标题中.

您要查找的标题称为"operationName"

所以这是一个例子:

<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> 
Run Code Online (Sandbox Code Playgroud)

(注意这个例子是使用apache aries blueprint - 但是除了命名空间之外,它对spring来说是相同的)


Ben*_*Day 6

尝试使用camel-simple表达式代替xpath ...

<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when>
Run Code Online (Sandbox Code Playgroud)