2012-02-08 47 views
15

mientras jugaba con Camel usando Spring DSL, me encontré con el siguiente problema. Supongamos que el flujo de mensajes esperada es el siguiente:Apache Camel: cómo almacenar la variable para un uso posterior

  1. cliente envía el mensaje HTTP POST con el cuerpo XML para Camel
  2. proxies CAMEL mensaje HTTP POST hacia el servidor, con el URI ligeramente adaptado utilizando información del cuerpo XML recibido (por ejemplo: utilizar XPath para filtrar un determinado parámetro)
  3. después de CAMEL ha recibido una respuesta, CAMEL envía un mensaje HTTP PUT hacia el servidor, utilizando parámetros fuera del cuerpo XML recibidos en 1

Así que algo como:

<route> 
    <from uri="..."> 
    <to uri="..."> 
    <to uri="..."> 
</route> 

Pregunta: ¿cómo puedo almacenar los parámetros en Spring DSL en el paso 1, para que pueda usarlos más adelante en el paso 3?

Por lo tanto, me gustaría extraer los parámetros XML del cuerpo XML del mensaje recibido en el paso 1 y ponerlos en variables, que luego puedo usar para redactar el mensaje que se enviará en el paso 3.

Para extraer los parámetros, estaba pensando en usar XPATH. Eso se ve bien, pero simplemente no veo cómo poner el resultado del XPATH en una variable y luego usar esa variable más adelante ... (sintaxis ??)

Nota: como pueden ver, mi desarrollo el conocimiento es bastante limitado ... lo siento por eso. Pero aún sería genial si alguien pudiera ayudar con esto :).

Respuesta

18

puede establecer almacenar datos en los Exchange propiedades o cabeceras de los mensajes como este ...

.setHeader("ID", XPathBuilder.xpath("/order/@id", String.class)) 
.setProperty("ID", XPathBuilder.xpath("/order/@id", String.class)) 

y luego recuperarlos en un grano/procesador de la Bolsa como esto ...

String propId = (String) exchange.getProperty("ID"); 
String headerId = (String) exchange.getIn().getHeader("ID");      } 
+2

Gracias ya por la respuesta. Sin embargo, ¿hay alguna posibilidad de obtener el mismo código pero para Spring DSL (notación XML)? Aclamaciones. – opstalj

+0

Mientras tanto, he vuelto a codificar con Java DSL y funciona muy bien. Gracias una vez más.Tengo una pregunta más: ¿cuál es la diferencia entre usar setHeader y setProperty? – opstalj

+3

Lea este capítulo para aprender sobre los conceptos de Camel, y sabrá cuál es la diferencia entre las propiedades y los encabezados: http://manning.com/ibsen/chapter1sample.pdf –

2

os dejo algunos ejemplos:

<setHeader headerName="token"> 
    <constant>someValue</constant> 
</setHeader> 

<setHeader headerName="userName"> 
    <simple>${properties:userName}</simple> //from config 
</setHeader> 

<setProperty propertyName="bodyBkp"> 
    <simple>${in.body}</simple> 
</setProperty> 

<setProperty propertyName="orderNumber"> 
    <xpath resultType="String">//item[1]/orderNumber/text()</xpath> 
</setProperty> 

Getter

${exchangeProperty[orderNumber]} 

${in.headers.token} 

Documentación

Comprobar el lenguaje simple expresión: http://camel.apache.org/simple.html

A veces mirar los casos de prueba de camello puede ser útil también, en particular, para la primavera DSL:

Cuestiones relacionadas