2012-07-27 19 views
7

Ich habe einen Dienst, der zwei Operationen hat.Apache Camel bedingten Routing

RegisterUser 
UpdateUser 

Ich habe ein Kamel Router:

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

In meinem Prozessor Bohne, wenn ich angeben:

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

ich das Register Benutzerobjekt. Alles funktioniert gut. Das Problem ist, dass ich Kamel meine Anfrage bedingt routen, zB für:

Wenn der Service-Operation RegisterUser ist ich die Nachricht an meine speziellen Bohne routen und wenn der Service-Betrieb UpdateUser ist, ich will die Nachricht zu routen zu der anderen Bohne.

Ich habe versucht, Kamel xPath zu verwenden, aber es scheint nicht zu funktionieren.

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

Ich war auf der Suche, wie Kamel auf dem Weg zu den verschiedenen Zielen zu gründen, aber nichts finden sich nicht. Vielleicht weiß jemand, wo das Problem sein könnte?

Antwort

14

Die Informationen der Operation wird in der Kopfzeile der Nachricht erforderlich.

Der Header Sie suchen, ‚operation‘

Also hier genannt wird, ist ein Beispiel:

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

(Beachten Sie das Beispiel unter Verwendung von Apache widder Plan - aber es wird für das Frühjahr identisch sein, anders als der Namensraum)

+0

Das funktioniert gut für mich. Genau das, was ich brauchte. Vielen Dank! :) –

4

Versuch camel-simple Ausdrücke anstelle von XPath für diese Verwendung ...

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