camel:将消息拆分为多个处理路径

时间:2014-05-28 22:22:07

标签: apache-camel

我的输入消息:

<file>
   <node1>
    ...
   </node1>
   .....
   <node10>
   .....
   </node10>
</file>

我想:

  1. 使用样式表处理整个文件并输出到Dest A

  2. 对于文件中的一些元素(例如,node1,node3和node7),我想提取它们并将每个元素的内容单独输出到Dest B

  3. 我知道如何使用样式表来处理文件,但我不知道如何处理另一个,更不用说将它们组合在一起了。 我正在寻找类似的东西:

    from(direct:start).magic_split(
     to("xslt:mysheet").to("destA"),
     setBody(xpath("//node1").to("destB"),
     setBody(xpath("//node3").to("destB"),
     setBody(xpath("//node7").to("destB"),
     ).transform(constant(responseOK);
    

3 个答案:

答案 0 :(得分:0)

如果您可以拆分XML,那么每个节点都会被放入其自己的交换中,如果您可以在拆分后识别该节点,那么您可以使用基于内容的路由器将交换路由到适当的目的地。这可能需要自定义拆分器bean,或者如果节点名为nodeX,其中X是数字,则可以从xpath执行此操作。

答案 1 :(得分:0)

根据我的需要,自定义bean可以很好地完成工作。我唯一需要弄清楚的是如何将消息恢复到原始内容。我想有一种更优雅的方式,但工作正常:

from("cxf:bean:submitOrder")
    .setProperty("originalData", simple("${in.body}")) //save original input msg
    .to("xslt:my.xsl").beanRef("customBean1)
    .setBody(simple("${property.originalData}"))       //restore original message
    .beanRef("customBean2");

答案 2 :(得分:0)

使用Wire Tap模式。此模式允许您在将消息转发到最终目的地时将消息路由到单独的位置:

from("cxf:bean:submitOrder")
    .wireTap("direct:tap")
    .beanRef("customBean2");

from("direct:tap")
    .to("xslt:my.xsl")
    .beanRef("customBean1);