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
}           

}

有什么想法吗?,我在调试模式下看到它们是两个不同的实例......

谢谢...

4

2 回答 2

1

最后我使用 Strategy 解决了这个问题

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;
}
于 2013-08-28T19:23:08.043 回答
0

我没有检查过这个,所以可能是错误的,但我假设你的拆分器的每次迭代都在改变消息,这就是你丢失标题的原因。

您可以尝试使用应在拆分器的下一次迭代中继续存在的 Exchange 属性:

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

...

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

编辑: 如果你真的想共享你的 bean 的实例,有一个重载的 bean 方法,它接受一个对象实例而不是一个类。

于 2013-08-26T22:45:07.383 回答