web-dev-qa-db-ja.com

ApacheCamel条件付きルーティング

2つの操作があるサービスがあります。

RegisterUser
UpdateUser

私はラクダの敗走を持っています:

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

私のプロセッサBeanで、次のように指定すると:

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

レジスタユーザーオブジェクトを取得します。すべてが正常に動作します。問題は、ラクダに私のリクエストを条件付きでルーティングさせたいということです。

サービス操作がRegisterUserの場合、メッセージを特定のBeanにルーティングし、サービス操作がUpdateUserの場合、メッセージを他のBeanにルーティングします。

キャメル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>

ラクダを別のターゲットにルーティングするように設定する方法を探していましたが、何も見つかりませんでした。たぶん誰かがどこに問題があるのか​​知っていますか?

10

必要な操作の情報は、メッセージのヘッダーにあります。

探しているヘッダーは「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> 

(この例ではApache ariesブループリントを使用していることに注意してください。ただし、名前空間を除いて、Springでも同じです)

19
AlanFoster

これには、xpathの代わりに camel-simple 式を使用してみてください...

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

Spring XMLルート私の場合、インバウンドJettyEPを使用しています。リクエストに応じてパラメータを確認します。 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>
0