Apache Camel:如何存储变量以供以后使用

20

在使用Spring DSL处理Camel时,我遇到了以下问题。假设预期的消息流如下:

  1. 客户端发送HTTP POST消息,其中包含XML正文,发送给CAMEL。
  2. CAMEL代理HTTP POST消息到服务器,使用从接收到的XML正文中获取的信息略微调整URI(例如:使用XPATH筛选出某个参数)。
  3. 在CAMEL收到回复后,使用从1中接收到的XML正文参数向服务器发送HTTP PUT消息。

所以类似这样:

<route>
   <from uri="...">
   <to uri="...">
   <to uri="...">
 </route>
问题:如何在Spring DSL中存储参数以便在步骤3中稍后使用?
因此,我想从步骤1接收的消息的XML正文中提取XML参数并将它们放入变量中,然后稍后可以使用这些变量来组成要在步骤3中发送的消息。
为了提取参数,我考虑使用XPATH。看起来还不错,但我不知道如何将XPATH的输出放入变量中,然后稍后使用该变量...(语法?)
注意:正如您所看到的,我的开发知识相当有限...对此感到抱歉。但如果有人能帮忙解决这个问题,那将是太好了 :)。
2个回答

26

您可以像这样将数据存储在Exchange属性或消息头中...

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

然后可以在bean/processor中像这样从Exchange中检索它们...

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

2
谢谢您的回复。不过,有没有可能提供相同的代码,但是使用Spring DSL(XML表示法)?谢谢。 - opstalj
1
与此同时,我使用Java DSL重新编码,它运行得很好。再次感谢。我还有一个问题:使用setHeader和setProperty有什么区别? - opstalj
4
阅读这一章节,了解Camel概念,您将会知道属性和头部之间的区别:http://manning.com/ibsen/chapter1sample.pdf - Claus Ibsen
谢谢。那一章讲得很清楚 :)。 - opstalj
setProperty 不接受三个参数。 - swade
.log("使用${exchangeProperty.ID}在路由中访问") - Gerry

10

我给您留下一些例子:

<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相关的:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接