2016-11-16 40 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