2012-02-08 22 views
15

mentre si "scherza" con Camel usando Spring DSL, mi sono imbattuto nel seguente problema. Supponiamo che il flusso dei messaggi atteso simile a questo:Apache Camel: come variabile di archivio per uso successivo

  1. client invia un messaggio HTTP POST con il corpo XML per cammello
  2. deleghe CAMEL messaggio HTTP POST verso di server, con l'URI leggermente adattato usando informazioni dal corpo XML ricevuti (ad esempio: utilizzare XPath per filtrare un determinato parametro)
  3. dopo CAMEL ha ricevuto una risposta, CAMEL invia il messaggio HTTP PUT verso server, utilizzando i parametri fuori dal corpo XML ricevuto in 1

Quindi, qualcosa di simile:

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

Domanda: come si memorizzano i parametri in DSL Spring al punto 1, in modo da poterli utilizzare successivamente nel passaggio 3?

Quindi, vorrei estrarre i parametri XML dal corpo XML del messaggio ricevuto nel passaggio 1 e inserirli in variabili, che in seguito posso utilizzare per comporre il messaggio da inviare al passaggio 3.

Per l'estrazione dei parametri, stavo pensando di utilizzare XPATH. Sembra ok, ma non vedo come mettere l'output di XPATH in una variabile e poi usare quella variabile più avanti ... (sintassi ??)

Nota: come potete vedere, il mio sviluppo la conoscenza è piuttosto limitata ... mi dispiace per quello. Ma sarebbe comunque bello se qualcuno potesse aiutare con questo :).

risposta

18

è possibile impostare i dati memorizzare nella Exchange proprietà o le intestazioni dei messaggi come questo ...

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

e poi recuperarli in un fagiolo/processore dalla Borsa come questo ...

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

Grazie già per la risposta. Tuttavia, c'è qualche possibilità di ottenere lo stesso codice ma per Spring DSL (notazione XML)? Saluti. – opstalj

+0

Nel frattempo, ho ricodificato con Java DSL e funziona bene. Grazie ancora.Ho ancora una domanda: qual è la differenza tra l'uso di setHeader e setProperty? – opstalj

+3

Leggi questo capitolo per conoscere i concetti Camel e saprai qual è la differenza tra proprietà e intestazioni: http://manning.com/ibsen/chapter1sample.pdf –

2

vi lascio alcuni esempi:

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

Documentazione

Controllare il semplice linguaggio delle espressioni: http://camel.apache.org/simple.html

volte guardando i test di Camel può essere utile pure, in particolare per la primavera DSL:

Problemi correlati