如何在Apache camel

时间:2016-11-16 11:51:46

标签: split apache-camel

我必须为数组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将为您提供内部拆分的迭代次数。我不确定如何在外部拆分中使用任何显式计数器。有没有其他方法可以实现我的目标?

2 个答案:

答案 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>