我正在逐行处理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
}
}
任何想法?,我在调试模式中看到它们是两个不同的实例......
...谢谢
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我没有检查过,所以可能是错的,但我认为你的拆分器的每次迭代都在改变消息,这就是你丢失标题的原因。
您可以尝试使用Exchange属性,这些属性应该在拆分器的下一次迭代中继续存在:
exchange.setProperty("IS_CORRECT_HEADER", new Integer(1));
...
Integer flag = (Integer) exchange.getProperty("IS_CORRECT_HEADER");
修改强> 如果你真的想要共享bean的一个实例,那么有一个overloaded bean method,它将对象实例不是一个类。