2012-07-27 57 views
7

Tôi có một dịch vụ có hai hoạt động.Apache Camel có điều kiện định tuyến

RegisterUser 
UpdateUser 

Tôi có một rout lạc đà:

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

Trong đậu xử lý của tôi, khi tôi ghi rõ:

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

tôi nhận được đối tượng người dùng đăng ký. Mọi thứ đều hoạt động tốt. Vấn đề là tôi muốn con lạc đà để định tuyến yêu cầu của tôi có điều kiện, cho ví dụ:

Nếu các hoạt động dịch vụ là RegisterUser Tôi muốn để định tuyến thông điệp tới đậu cụ thể của tôi và nếu các hoạt động dịch vụ là UpdateUser Tôi muốn để định tuyến thông điệp cho đậu khác.

Tôi đã cố sử dụng lạc đà xPath, nhưng dường như nó không hoạt động.

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

Tôi đã tìm cách thiết lập con lạc đà để định tuyến đến các mục tiêu khác nhau nhưng không tìm thấy gì. Có lẽ ai đó biết nơi nào có thể là vấn đề?

Trả lời

14

Các thông tin về các hoạt động cần thiết sẽ nằm trong tiêu đề của thông điệp.

Tiêu đề bạn đang tìm kiếm được gọi là 'operationName'

Vì vậy, đây là một ví dụ:

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

(Lưu ý ví dụ đang sử dụng kế hoạch chi tiết aries apache - nhưng nó sẽ giống hệt nhau cho mùa xuân, khác với không gian tên)

+0

Điều này rất hữu ích cho tôi. Chính xác những gì tôi cần. Cảm ơn bạn! :) –

4

thử sử dụng camel-simple biểu thay vì xpath cho điều này ...

<when><simple>${body} is 'com.RegisterUser'</simple><to uri="..."/></when> 
Các vấn đề liên quan