2012-07-27 31 views
7

Ho un servizio che ha due operazioni.Routing condizionale Apache Camel

RegisterUser 
UpdateUser 

Ho una rotta cammello:

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

Nel mio fagioli processore, quando ho specificare:

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

ottengo l'oggetto utente registro. Tutto funziona bene Il problema è che voglio cammello percorso la mia richiesta a condizioni ovvero ad esempio:

Se l'operazione di servizio è RegisterUser voglio instradare il messaggio al mio fagioli specifica e se l'operazione di servizio è UpdateUser voglio instradare il messaggio all'altro fagiolo.

Ho provato a utilizzare cammello xPath, ma non sembra funzionare.

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

Stavo cercando come impostare il cammello per il percorso verso i diversi obiettivi ma non ha trovato nulla. Forse qualcuno sa dove potrebbe essere il problema?

risposta

14

Le informazioni della operazione richiesta sarà nell'intestazione del messaggio.

L'intestazione che stai cercando si chiama 'operationName'

Quindi, ecco un esempio:

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

(Notare l'esempio sta usando apache progetto Aries - ma sarà identico per la primavera, diverso dal namespace)

+0

Questo funziona perfettamente per me. Esattamente quello di cui avevo bisogno. Grazie! :) –

4

provare a utilizzare camel-simple espressioni invece di XPath per questo ...

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