1

私はcsvファイルを1行ずつ処理していますが、コンテンツを処理する前に、ヘッダーを検証する必要があります(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
}           

}

何か考えはありますか?、デバッグ モードで、それらが 2 つの異なるインスタンスであることがわかりました...

ありがとう...

4

2 に答える 2

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;
}
于 2013-08-28T19:23:08.043 に答える