2012-02-10 9 views
7

me gustaría obtener la siguiente clase de enrutamiento:Apache Camel: ¿puedo agregar varias declaraciones en la parte de cuándo de la declaración de elección condicional?

  1. mensaje HTTP POST con el cuerpo XML entra CAMEL
  2. almaceno algunos de los parámetros del cuerpo XML
  3. el mensaje se enruta a un externo punto final
  4. el criterio de valoración externa (servidor externo) responde

-> en este momento, me gustaría comprobar si la respuesta de la variable externa es un HTTP 20 0 Aceptar que contiene un parámetro XML igual a SUCCESS. -> si es así, me gustaría utilizar algunos de los parámetros almacenados para construir un nuevo mensaje HTTP (method = PUT esta vez) y enviarlo a un punto extremo externo

Problema que estoy teniendo actualmente, es el siguiente:

.choice() 
.when(simple("${in.headers.CamelHttpResponseCode} == 200")) 
    // now I want do a few things, eg: check also the XML body via xpath 
    // and change the message to be sent out (change Method to PUT, ...) 
    .to("http://myserver.com") 
.otherwise() 
    // if no 200 OK, I want the route to be stopped ... not sure how ? 
.end() 

Pregunta: alguna idea de cómo agregar esas declaraciones adicionales en caso de que el código de respuesta HTTP fuera 200 correcto? Parece que el cuándo no me permite agregar declaraciones adicionales ... (recibí un error en mi Eclipse IDE).

Gracias de antemano.

Nota: ¿podría ser que tengo que enrutar el mensaje en caso de que el 200 OK coincida con un 'nuevo punto final' y luego crear una nueva ruta con este nuevo punto final? Ej:

.choice() 
    .when(simple("${in.headers.CamelHttpResponseCode} == 200")) 
     .to("mynewendpoint") 
    .otherwise() 
     // if no 200 OK, I want the route to be stopped ... not sure how ? 
    .end(); 

from("mynewendpoint"). 
    .setHeader(etc etc) 
    .to("http://myserver.com") 

En este último caso, ¿cómo es exactamente que debe definir este 'newendpoint'?

Respuesta

20

En el lenguaje de programación DSL como Java, puede construir predicados juntos. He publicado una entrada de blog hace unos años acerca de esto en: http://davsclaus.blogspot.com/2009/02/apache-camel-and-using-compound.html

Por ejemplo tener dos predicados

Predicate p1 = header("hl7.msh.messageType").isEqualTo("ORM"): 
Predicate p2 = header("hl7.msh.triggerEvent").isEqualTo("001"); 

Se les puede encadenar juntos, usando AND y OR.

Predicate isOrm = PredicateBuilder.and(p1, p2); 

Y entonces usted puede utilizar ISORM en la ruta

from("hl7listener") 
    .unmarshal(hl7format) 
    .choice() 
     .when(isOrm).beanRef("hl7handler", "handleORM") 
     .otherwise().beanRef("hl7handler", "badMessage") 
    .end() 
    .marshal(hl7format); 
+0

¡Super! Gracias. – opstalj

+0

Cualquier razón por la cual 'Predicate isOrm = PredicateBuilder.and (header (" hl7.msh.messageType "). IsEqualTo (" ORM "), header (" hl7.msh.triggerEvent "). IsEqualTo (" 001 "));' no funcionaria? ¿Algo sobre cómo y cuándo se evalúa? – Antares42

+0

¿Hay alguna manera de usar este PredicateBuilder en un modelo? – Yannick

4

sí, que puede tener varios estados entre el .cuando() y .otherwise() y siempre se puede llamar .endChoice() para finalizar explícitamente cada bloque condicional ...

a su otra pregunta, puede usar camel-direct para encadenar varias rutas, etc ...

+0

Gracias. Debo haber cometido un error de sintaxis antes. De hecho, puedo simplemente ingresar varias declaraciones entre .when() y .otherwise(). – opstalj

Cuestiones relacionadas