2013-04-11 144 views
0

我有以下路線DSL:Apache的駱駝:訪問CamelLoopIndex

from("file:" + autoLoadBaseDir + "?move=.classified") 
       .loop(fileTypes.length) 
        .choice() 
         .when(header("CamelFileName").contains(fileTypes[Integer.valueOf("${CamelLoopIndex}")])) 
          .to("file:" + classesBaseDir + "/" + fileTypes[Integer.valueOf("${CamelLoopIndex}")]); 

如圖所示,我希望訪問CamelLoopIndex並使用它作爲在陣列中的索引。表達式不計算,因此路由不會被創建。我究竟做錯了什麼?提前致謝。

這方面的文檔很少,而且我還沒有成功地在搜索幾個小時後獲得解決方案。

UPDATE:我已經發布了同樣的問題到駱駝用戶郵件列表。

回答

0

我遲到了,但也許有人會從這個答案得到幫助。在上面給出的例子中,這適用於我訪問Java DSL中的循環索引。

property(Exchange.LOOP_INDEX) 

所以對於來自於奧凱洛後的第一個上面的例子我想這會工作

Integer.valueOf(property(Exchange.LOOP_INDEX).toString()) 
4

您應該使用$ {} property.CamelLoopIndex

+0

我用這個,但不知何故表達不能得到解決。 – okello 2013-04-11 16:27:05

+0

假設您可以在「簡單」表達式中使用$ {property.CamelLoopIndex}。如果你不使用簡單的try屬性(「CamelLoopIndex」) – katrin 2013-04-12 12:49:26

+0

我只是使用了一個額外的處理器,我可以通過調用exchange.getProperty(「CamelLoopIndex」)來提取循環索引,並使用索引來獲取實際值我想,將其設置在標題中,並在隨後的路線組件中訪問它。看到下面的答案(我在這裏發佈我的解決方案)。 – okello 2013-04-12 12:57:14

0

已經嘗試與周圍的一些選項,我下面的作品:

from("file:" + autoLoadBaseDir + "?preMove=inprogress&move=.classified") 
       .routeId("Test-Route") 
       .loop(fileTypes.length) 
       .processRef("keFileTypeNameService") 
        .choice() 
         .when(header("CamelFileName").contains(header("MyFileType"))) 
          .to("file:" + classesBaseDir + "/?autoCreate=true&fileName=${header[MyFileType]}/${header[CamelFileName]}"); 

keFileTypeNameService檢索來自交換CamelLoopIndex財產。然後它使用它來獲取該索引處的文件類型。然後只需在標題中設置該文件類型名稱即可。該keFileTypeNameService豆如下:

@Service(value = "keFileTypeNameService") 
public class FileTypeNameService implements Processor { 

    private @Value("${ke.file.types}") String[] fileTypes; 

    public void process(Exchange exchange) throws Exception { 
     Integer count = exchange.getProperty("CamelLoopIndex", Integer.class); 
     String fileType = fileTypes[count]; 
     exchange.getIn().setHeader("MyFileType", fileType); 
    } 




} 

我希望這有助於別人。