2016-11-16 39 views
1

我必须为数组B的每个元素调用一个服务,但是数组A在数组A中。所以我尝试在split中使用拆分,如下所示camel_Context.xml。一旦所有的内部拆分数组值被执行,我也需要将它们聚合在一起。如何在Apache骆驼中使用内部拆分的外部拆分的CamelSplitIndex

<split> 
    <jsonpath>$.Request.Fruits</jsonpath> 
    <split> 
     <jsonpath>$.request.Fruits[index].item</jsonpath> 

     <to someURI> 
    </split> 
</split> 

我在内部分割中使用的索引应该说外部分割的当前迭代。 CamelSplitIndex会给你内部分割的迭代次数。我不确定如何在外部分割中使用任何明确的计数器。有没有其他方法可以实现我的目标?

回答

2

您可以设置自定义标题

<split> 
    <jsonpath>$.Request.Fruits</jsonpath> 
    <setHeader headerName="OuterIndex"> 
     <simple>${header.CamelSplitIndex}</simple> 
    </setHeader> 
    <split strategyRef="aggregatorBean"> 
     <jsonpath>$.request.Fruits[index].item</jsonpath> 
     <setHeader headerName="InnerIndex"> 
      <simple>${header.CamelSplitIndex}</simple> 
     </setHeader> 
     <to someURI> 
     <log message="Hello from inner ${header.InnerIndex} of outer ${header.OuterIndex}" /> 
    </split> 
</split> 

你可以用你的逻辑(见Splitter pattern page了解详细信息)使用一个bean作为AggregationStrategy到汇总结果。在这种策略中,如果需要,您可以阅读两个标题。

记住每个<split>会自动遍历你的阵列,就像Java的增强for,所以想象大致做的路线如下:

// <split> is very much like 
for (Fruit f : request.getFruits()) { 
    // outer loop 
    for (Item i : f.getItems() { 
     // inner loop, <to someURI> is located here 
    } 
} 
+0

谢谢。但是内部分割的输入是类java.util.LinkedHashMap。有没有什么办法可以解析路由中的LikedHashMap(比如jsonpath) – Jay

+0

我会转换成POJO http://camel.apache.org/json.html或者使用处理器https://camel.apache.org/processor .html,这取决于路线实际上做了什么。 –

1

其实当你分割你为你的分裂阵列的各个条目分割部分,因此里面的身体,你应该能够如下使用它,并通过@Alessandro提到你可以使用聚合策略聚合拆分项how-to-implement-the-splitter-and-aggregator-patterns-with-apache-camel

<split> 
    <jsonpath>$.Request.Fruits</jsonpath> 
    <split strategyRef="aggregatorBean"> 
     <jsonpath>$.item</jsonpath> <!-- your body here itself is a Fruit--> 
     <to someURI> 
    </split> 
</split> 
+0

谢谢sagar ..它帮助我更好地理解..唯一的事情是,因为它是一个json数据,外部分离器的输出是LinkEdHashMap格式。我必须使用一个bean将它再次转换为json。 – Jay