如何在 Apache Camel 中的内部拆分中使用外部拆分的 CamelSplitIndex

Jay*_*Jay 6 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> 
Run Code Online (Sandbox Code Playgroud)

我在内部分割中使用的索引应该表示外部分割的当前迭代。CamelSplitIndex 将为您提供内部拆分的迭代次数。我不确定如何在外部分割中使用任何显式计数器。请问还有其他方法可以实现我的目标吗?

Ale*_*gna 5

您可以设置自定义标题

<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>
Run Code Online (Sandbox Code Playgroud)

您可以使用 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
    }
}
Run Code Online (Sandbox Code Playgroud)