2012-02-10 9 views
7

Chciałbym uzyskać następujące rodzaje tras:Apache Camel: czy mogę umieścić wiele instrukcji w części warunkowej instrukcji wyboru?

  1. HTTP wiadomość POST z ciałem XML wchodzi CAMEL
  2. przechowywać niektóre parametry ciała XML
  3. komunikat jest kierowany do zewnętrznego Punkt końcowy
  4. zewnętrzny punkt końcowy (serwer zewnętrzny) odpowiada

-> w tej chwili, chciałbym sprawdzić, czy odpowiedź z punktu końcowego zewnętrznego jest HTTP 20 0 OK zawierające parametr XML równy SUKCESOWI. -> jeśli tak, to chciałbym użyć niektórych z przechowywanych parametrów do skonstruowania nowego komunikatu HTTP (metoda = PUT tym razem) i wysłać go do zewnętrznego punktu końcowego

Problem, który mam obecnie, jest co następuje:

.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() 

Pytanie: jakikolwiek pomysł, jak dodać te dodatkowe instrukcje na wypadek, gdyby kod odpowiedzi HTTP był 200 OK? Wygląda na to, że kiedy nie pozwala mi dodawać dodatkowych instrukcji ... (Mam błąd w moim IDE Eclipse).

Z góry dziękuję.

Uwaga: czy możliwe jest wysłanie wiadomości na wypadek, gdyby 200 OK pasowało do "nowego punktu końcowego", a następnie utworzenie nowej trasy z tego nowego punktu końcowego? Np

.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") 

W tym ostatnim przypadku, jak dokładnie należy zdefiniować to „newendpoint”?

Odpowiedz

20

W językach programowania DSL, takich jak Java, można tworzyć predykaty razem. Zamieściłem wpis blogu kilka lat temu na ten temat pod adresem: http://davsclaus.blogspot.com/2009/02/apache-camel-and-using-compound.html

na przykład o dwa predykaty

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

Można łańcucha je razem za pomocą AND lub OR.

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

a następnie można użyć isOrm w trasie

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

Super! Dzięki. – opstalj

+0

Dowolny powód, dla którego 'Predicate isOrm = PredicateBuilder.and (header (" hl7.msh.messageType "). IsEqualTo (" ORM "), nagłówek (" hl7.msh.triggerEvent "). IsEqualTo (" 001 "));' nie działa? Coś o tym, jak i kiedy jest oceniane? – Antares42

+0

Czy istnieje sposób użycia tego PredicateBuilder w blueprint? – Yannick

4

Tak, można mieć wiele sprawozdań między .Przy() i .otherwise() i zawsze można zadzwonić .endChoice(), aby jednoznacznie zakończyć każdy blok warunkowy ...

do innego pytanie, może używać camel-direct do łączenia wielu tras, itd ...

+0

dzięki. Musiałem już wcześniej popełnić błąd składni, faktycznie mogę wprowadzić wiele instrukcji pomiędzy .when() i .other(). – opstalj

Powiązane problemy