2013-08-26 71 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这需要一个对象实例不是一个类。