Apache Camel: как хранить переменную для последующего использования - PullRequest
16 голосов
/ 08 февраля 2012

во время «игры» с Camel с использованием Spring DSL я столкнулся со следующей проблемой. Предположим, что ожидаемый поток сообщений выглядит следующим образом:

  1. клиент отправляет сообщение HTTP POST с телом XML на CAMEL
  2. CAMEL передает сообщение HTTP POST к серверу, а URI слегка адаптируется с помощью информация из полученного тела XML (например, используйте XPATH для фильтрации определенного параметра)
  3. после того, как CAMEL получил ответ, CAMEL отправляет сообщение HTTP PUT на сервер, используя параметры из тела XML, полученные в 1

Так что-то вроде:

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

Вопрос: как сохранить параметры в Spring DSL на шаге 1, чтобы я мог использовать их позже на шаге 3?

Итак, я хотел бы извлечь параметры XML из тела XML сообщения, полученного на шаге 1, и поместить их в переменные, которые я позже смогу использовать для составления сообщения, которое будет отправлено на шаге 3.

Для извлечения параметров я думал об использовании XPATH. Это выглядит нормально, но я просто не вижу, как поместить вывод XPATH в переменную и затем использовать эту переменную позже ... (синтаксис ??)

Примечание: как вы видите, мои знания в области разработки довольно ограничены ... извините за это. Но было бы здорово, если бы кто-то мог помочь с этим:).

Ответы [ 2 ]

20 голосов
/ 08 февраля 2012

вы можете установить данные хранилища в свойствах Exchange или заголовках сообщений, как это ...

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

, а затем извлечь их в компоненте / процессоре из Exchange, как это...

String propId = (String) exchange.getProperty("ID");
String headerId = (String) exchange.getIn().getHeader("ID");                        }
3 голосов
/ 21 октября 2017

Я оставляю вам несколько примеров:

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

Документация

Проверьте язык простых выражений: http://camel.apache.org/simple.html

Иногда полезно посмотреть на тестовые примеры Camel, в частности для Spring DSL:

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