2012-07-27 24 views
7

Tengo un servicio que tiene dos operaciones.Enrutamiento condicional Apache Camel

RegisterUser 
UpdateUser 

que tienen una derrota camello:

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

En mi grano de procesador, cuando especifico:

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

recibo el objeto de usuario de registro. Todo funciona bien El problema es que quiero camello para encaminar mi petición condicional, por ejemplo:

Si la operación de servicio es RegisterUser quiero encaminar el mensaje a mi frijol específica y si la operación del servicio es UpdateUser Quiero encaminar el mensaje al otro frijol

He intentado utilizar camel xPath, pero parece que no funciona.

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

Estaba buscando cómo configurar el camello para encaminarme a los diferentes objetivos pero no encontré nada. ¿Tal vez alguien sabe dónde podría estar el problema?

Respuesta

14

La información de la operación requerida será en la cabecera del mensaje.

La cabecera está buscando se llama 'operationName'

Así que aquí es un ejemplo:

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

(Tenga en cuenta el ejemplo es el uso de anteproyecto aries Apache - pero será idéntica para la primavera, que no sea el espacio de nombres)

+0

Esto funciona muy bien para mí. Exactamente lo que necesitaba. ¡Gracias! :) –

4

tratar de usar camel-simple expresiones en lugar de XPath para este ...

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