Apache Camel: могу ли я поместить несколько операторов в часть когда оператор условного выбора? - PullRequest
9 голосов
/ 10 февраля 2012

Я хотел бы получить следующий вид маршрутизации:

  1. Сообщение HTTP POST с телом XML входит в CAMEL
  2. Я храню некоторые параметры тела XML
  3. Сообщение направляется на внешнюю конечную точку
  4. Ответы внешней конечной точки (внешнего сервера)

-> в данный момент я хотел бы проверить, является ли ответ от внешней конечной точки HTTP 200 OK, содержащий параметр XML, равный SUCCESS. -> если так, то я бы хотел использовать некоторые из сохраненных параметров для создания нового HTTP-сообщения (на этот раз = PUT) и отправить его на внешнюю конечную точку

Проблема, с которой я сейчас сталкиваюсь, заключается в следующем:

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

Вопрос: есть идеи, как добавить эти дополнительные операторы в случае, если код ответа HTTP был в порядке? Похоже, когда не позволяет мне добавлять дополнительные заявления ... (Я получил ошибку в Eclipse IDE).

Заранее спасибо.

Примечание: может ли быть так, что я должен направить сообщение в случае, если 200 OK соответствует «новой конечной точке», а затем создать новый маршрут от этой новой конечной точки? Например:

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

В этом последнем случае, как именно я должен определить эту «новую конечную точку»?

Ответы [ 2 ]

23 голосов
/ 14 февраля 2012

В DSL на языке программирования, таких как Java, вы можете создавать предикаты вместе.Несколько лет назад я опубликовал запись в блоге об этом по адресу: http://davsclaus.blogspot.com/2009/02/apache-camel-and-using-compound.html

Например, с двумя предикатами

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

Вы можете связать их вместе, используя и или или.

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

И тогда вы можете использовать isOrm в маршруте

from("hl7listener")
    .unmarshal(hl7format)
    .choice()
        .when(isOrm).beanRef("hl7handler", "handleORM")
        .otherwise().beanRef("hl7handler", "badMessage")
    .end()
    .marshal(hl7format);
4 голосов
/ 11 февраля 2012

Да, вы можете иметь несколько операторов между .when () и .otherwise (), и вы всегда можете вызвать .endChoice (), чтобы явно завершить каждый условный блок ...

к вашему другому вопросу, вы можете использовать camel-direct , чтобы объединить несколько маршрутов и т. Д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...