Apache Camel:如何存储变量以供以后使用
Posted
技术标签:
【中文标题】Apache Camel:如何存储变量以供以后使用【英文标题】:Apache Camel: how store variable for later use 【发布时间】:2012-02-29 23:18:00 【问题描述】:在使用 Spring DSL 与 Camel “玩耍”时,我遇到了以下问题。假设预期的消息流如下所示:
-
客户端向 CAMEL 发送带有 XML 正文的 HTTP POST 消息
CAMEL 将 HTTP POST 消息代理到服务器,使用 URI 稍作修改
接收到的 XML 正文中的信息(例如:使用 XPATH 过滤掉某个参数)
在 CAMEL 收到回复后,CAMEL 使用 1 中收到的 XML 正文中的参数向服务器发送 HTTP PUT 消息
比如:
<route>
<from uri="...">
<to uri="...">
<to uri="...">
</route>
问题:如何在步骤 1 中将参数存储在 Spring DSL 中,以便稍后在步骤 3 中使用?
所以,我想从步骤 1 中接收到的消息的 XML 正文中提取 XML 参数,并将它们放入变量中,然后我可以使用这些变量来编写要在步骤 3 中发送的消息。
为了提取参数,我正在考虑使用 XPATH。看起来不错,但我只是不知道如何将 XPATH 的输出放入变量中,然后稍后使用该变量......(语法??)
注意:如您所见,我的开发知识相当有限……抱歉。但是,如果有人可以帮助解决这个问题,那就太好了:)。
【问题讨论】:
【参考方案1】:我给你举几个例子:
<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>
吸气剂
$exchangeProperty[orderNumber]
$in.headers.token
文档
检查简单表达式语言: http://camel.apache.org/simple.html
有时查看 Camel 的测试用例也会有所帮助,尤其是对于 Spring DSL:
setProperty with Spring DSL setHeader using XPATH with Spring DSL simple expression language test【讨论】:
【参考方案2】:您可以像这样在Exchange 属性或消息头中设置存储数据...
.setHeader("ID", XPathBuilder.xpath("/order/@id", String.class))
.setProperty("ID", XPathBuilder.xpath("/order/@id", String.class))
然后像这样在 Exchange 的 bean/处理器中检索它们...
String propId = (String) exchange.getProperty("ID");
String headerId = (String) exchange.getIn().getHeader("ID");
【讨论】:
感谢您的回复。但是,除了 Spring DSL(XML 表示法)之外,是否有机会获得相同的代码?干杯。 同时,我用 Java DSL 重新编码,效果很好。再次感谢。我还有 1 个问题:使用 setHeader 和 setProperty 有什么区别? 阅读本章了解骆驼的概念,你就会知道属性和标题的区别:manning.com/ibsen/chapter1sample.pdf 谢谢。那一章解释得很好:)。setProperty
不接受三个参数。以上是关于Apache Camel:如何存储变量以供以后使用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apache Camel 从 Java 类访问 JMS 队列?
如何将 TWIG 输出渲染到变量以供以后使用(symfony2)?