2012-02-08 17 views
15

podczas "zabawy" z Camel przy użyciu Spring DSL, natknąłem się na następujący problem. Załóżmy, że oczekiwany przepływ wiadomość wygląda tak:Apache Camel: jak przechowywać zmienną do późniejszego wykorzystania

  1. klient wysyła wiadomość HTTP POST z ciałem XML do Camel
  2. Camel Prokurenci wiadomość HTTP POST w stronę serwera, z URI nieznacznie dostosowane za pomocą informacji z odebranego ciała XML (np: za pomocą XPath do odfiltrować pewien parametr)
  3. po CAMEL otrzymał odpowiedź, CAMEL wysyła wiadomość HTTP PUT do serwera za pomocą parametrów z organizmu XML otrzymanego w 1

Więc coś takiego:

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

Pytanie: w jaki sposób zapisać parametry w Spring DSL w kroku 1, aby móc z nich korzystać później w kroku 3?

Chciałbym więc wyodrębnić parametry XML z treści XML komunikatu otrzymanego w kroku 1 i umieścić je w zmiennych, które następnie będę mógł wykorzystać do skomponowania wiadomości, która zostanie wysłana w kroku 3.

Dla wyodrębnienia parametrów, myślałem o używaniu XPATH. To wygląda dobrze, ale po prostu nie widzę sposobu, aby umieścić wyjście XPATH w zmiennej, a następnie użyć tej zmiennej później ... (składnia ??)

Uwaga: jak widać mój rozwój wiedza jest raczej ograniczona ... przepraszam za to. Ale nadal byłoby wspaniale, gdyby ktoś mógł w tym pomóc :).

Odpowiedz

18

można ustawić przechowywania danych we właściwościach Exchange lub nagłówków wiadomości tak ...

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

a następnie pobrać je w fasoli/procesora z wymiany jak to ...

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

Dzięki już za odpowiedź. Czy istnieje jednak szansa na uzyskanie tego samego kodu, ale dla Spring DSL (notacja XML)? Twoje zdrowie. – opstalj

+0

W międzyczasie ponownie zakodowałem z Java DSL i działa dobrze. Jeszcze raz dziękuję.Mam jeszcze jedno pytanie: jaka jest różnica między używaniem setHeader i setProperty? – opstalj

+3

Przeczytaj ten rozdział, aby poznać pojęcia dotyczące wielbłądów, a dowiesz się jaka jest różnica pomiędzy właściwościami i nagłówkami: http://manning.com/ibsen/chapter1sample.pdf –

2

zostawiam wam kilka przykładów:

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

Dokumentacja

Sprawdź prostym językiem wyrażenie: http://camel.apache.org/simple.html

Czasem patrząc na testach wielbłąd może być pomocne, a także, w szczególności na wiosennym DSL:

Powiązane problemy