2012-07-27 2 views
7

У меня есть служба, которая имеет две операции.Условная маршрутизация Apache Camel

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> 

В моем процессоре боба, когда я указать:

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

я получаю объект регистра пользователя. Все работает нормально. Проблемы заключается в том, что я хочу верблюд маршрутизировать мой запрос условно, для например:

Если операция услуги RegisterUser Я хочу маршрутизировать сообщение для моего конкретного компонента и, если операция услуги UpdateUser Я хочу маршрутизировать сообщение к другому фасоли.

Я попытался использовать верблюд 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> 

Я искал, как настроить верблюда на маршрут к различным объектам, но ничего не нашел. Может, кто-нибудь знает, где может быть проблема?

ответ

14

Информация о работе, необходимой будет в заголовке сообщения.

Заголовок вы ищете называется «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> 

(Обратите внимание на пример использует апачский Овне план - но она будет идентична весной, кроме пространства имен)

+0

Это отлично работает для меня. Именно то, что мне нужно. Спасибо! :) –

4

попробуйте использовать camel-simple выражения вместо XPath для этого ...

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