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: