Apache Camel: как хранить переменную для последующего использования

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

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

Documentation

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

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