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

时间:2012-02-08 13:58:06

标签: spring apache-camel

当使用Spring DSL与Camel“玩”时,我遇到了以下问题。假设预期的消息流如下所示:

  1. 客户端将带有XML正文的HTTP POST消息发送到CAMEL
  2. CAMEL将HTTP POST消息代理到服务器,使用稍微调整的URI 来自收到的XML正文的信息(例如:使用XPATH过滤掉某个参数)
  3. CAMEL收到回复后,CAMEL向服务器发送HTTP PUT消息,使用1中收到的XML正文中的参数
  4. 类似于:

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

    问题:如何在步骤1中将参数存储在Spring DSL中,以便我可以在后面的步骤3中使用它们?

    因此,我想从步骤1中收到的消息的XML主体中提取XML参数并将它们放入变量中,然后我可以使用这些变量来编写要在步骤3中发送的消息。

    为了提取参数,我正在考虑使用XPATH。看起来没问题,但我只是不知道如何将XPATH的输出放入变量中,然后再使用该变量......(语法??)

    注意:正如您所看到的,我的开发知识相当有限......对不起。但如果有人可以帮助解决这个问题,那将会很棒。)。

2 个答案:

答案 0 :(得分:18)

您可以在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");                        }

答案 1 :(得分:3)

我给你举一些例子:

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