2013-08-26 2 views
1

Я обрабатываю файл csv, строка за строкой, теперь перед обработкой содержимого требуется для проверки заголовков (первая строка из csv). Я пытаюсь установить свойство в заголовке (Exchange), но когда я читаю следующую строку из файла, я потерял свойство, которое я создал ранее.Camel Split File and 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

Я не проверял это, так что может быть неправильно, но я предполагаю, что каждая итерация вашего splitte r меняет сообщение, поэтому вы теряете заголовок.

Вы можете попробовать использовать свойство Exchange, которые должны выжить на следующую итерацию вашего разветвителя:

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

... 

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

Edit: Если вы действительно хотите поделиться экземпляром вашего боба, есть overloaded bean method, который принимает экземпляр объекта, а не класс.