我必须为数组B的每个元素调用一个服务。但是数组A在数组A中。因此我尝试在camel_Context.xml中使用split inside split,如下所示。一旦执行了所有内部拆分数组值,我也需要聚合它们。
<split>
<jsonpath>$.Request.Fruits</jsonpath>
<split>
<jsonpath>$.request.Fruits[index].item</jsonpath>
<to someURI>
</split>
</split>
我在内部拆分中使用的索引应该说是外部拆分的当前迭代。 CamelSplitIndex将为您提供内部拆分的迭代次数。我不确定如何在外部拆分中使用任何显式计数器。有没有其他方法可以实现我的目标?
答案 0 :(得分:3)
您可以设置自定义标题
<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>
您可以使用bean作为AggregationStrategy来使用您的逻辑聚合结果(有关详细信息,请参阅Splitter pattern page)。在这种策略中,如果需要,您可以读取两个标题。
请注意每个<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
}
}
答案 1 :(得分: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>