2013-08-26 105 views
1

我正在處理一個csv文件,現在在處理內容之前,現在需要驗證頭文件(從csv開始的第一行)。我試圖在頭文件(Exchange)中設置屬性,但是當我從文件中讀取下一行時,我丟失了之前設置的屬性。駱駝拆分文件和交換

from("file:/home/archivos/") 
    .split().tokenize("\n",1) 
     .choice() 
     .when(simple("${property.CamelSplitIndex} > 0")) 
      .bean(BindingMDS.class, "processContent(${body}, ${file:name})") 
     .otherwise() 
      .bean(BindingMDS.class, "processHeader(${body}, ${file:name}"); 

這就是它的豆

public class BindingMDS { 
... 

public void processHeader(String cabeceras, String nombreArchivo, Exchange exchange) { 
    ... // validate columns from header 
    exchange.getIn().setHeader("IS_CORRECT_HEADER", new Integer(1)); 
} 

public String processContent(String body, String nombreArchivo, Exchange exchange) { 
    Integer flag = (Integer) exchange.getIn().getHeader("IS_CORRECT_HEADER"); 
    // ... this value is null 
}   

}

任何想法?我在調試模式下,他們是兩個不同的實例看到...

謝謝...

回答

1

最後我決定用戰略

from("file:/home/archivos/") 
    .split(body().tokenize("\n"), new MyStrategyCSV()) 
     .choice()   
     .when(simple("${property.CamelSplitIndex} > 0")) 
      .bean(BindingMDS.class, "processContent(${body})") 
     .otherwise() 
      .bean(BindingMDS.class, "processHeader(${body})") // validate headers from csv and setup property in Exchange 
     .end() // end choice 
    .end() // end splitter 
.to("direct:processNewContent"); 

from("direct:processNewContent") 
    .bean(BindingMDS.class, "validateFile(${body})"); 

與策略這個問題...

@Override 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 

    if (oldExchange == null) { 
     // the first time we aggregate we only have the new exchange, 
     // so we just return it 
     return newExchange; 
    } 

    ... 

    // return old 
    return oldExchange; 
} 
0

我沒有檢查過,所以可能是錯誤的,但我認爲你的分裂的每一次迭代r正在改變消息,這就是爲什麼你失去標題。

你可以嘗試使用這應該生存的分離器的下一次迭代Exchange屬性:

exchange.setProperty("IS_CORRECT_HEADER", new Integer(1)); 

... 

Integer flag = (Integer) exchange.getProperty("IS_CORRECT_HEADER"); 

編輯: 如果你真的想分享你的bean的實例,有一個overloaded bean method這需要一個對象實例不是一個類。