2つの操作があるサービスがあります。
RegisterUser
UpdateUser
私はラクダの敗走を持っています:
<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>
私のプロセッサ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&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>
ラクダを別のターゲットにルーティングするように設定する方法を探していましたが、何も見つかりませんでした。たぶん誰かがどこに問題があるのか知っていますか?
必要な操作の情報は、メッセージのヘッダーにあります。
探しているヘッダーは「operationName」と呼ばれます
だからここに例があります:
<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>
(この例ではApache ariesブループリントを使用していることに注意してください。ただし、名前空間を除いて、Springでも同じです)
これには、xpathの代わりに camel-simple 式を使用してみてください...
<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when>
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>