2011-11-14 86 views
12

我想开发一个轮询包含CSV文件的目录的路由,以及使用Bindy解组每个文件并将其排列在activemq队列中的每个文件。在Apache Camel中处理大型CSV文件的最佳策略

问题是文件可能非常大(一百万行),所以我宁愿一次排队一行,但我得到的是在一个java.util.ArrayList结尾的所有行Bindy导致内存问题。

到目前为止,我有一个测试和解组正在工作,所以使用注释的Bindy配置是好的。

这里是路线:

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal() 
    .bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 

环境是:Eclipse的靛蓝,Maven的3.0.3,2.8.0骆驼

谢谢

回答

26

如果您使用分离器EIP,那么你可以使用流模式,这意味着骆驼将逐行处理文件。

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .split(body().tokenize("\n")).streaming() 
    .unmarshal().bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 
+0

感谢克劳斯您回答。现在我面临着一个不同的问题。继续我的小练习,我试图从队列中提取并用'.convertBodyTo(String.class).to(“file:data/outbox?fileExist = Append”)写入文件,但只有第一行获取书面。所有相同的,如果我使用文件选项覆盖,我只得到最后一行。有没有办法将CSV文件中的所有行写入文件?谢谢 – Taka

+0

你需要指定一个文件名.to(“file:data/outbox?fileName = data.csv&fileExist = Append”) –

+0

在'.streaming()后面加'.thread()'可以更有效率? – Pith

2

为了记录和可能已经寻找这不亚于我的其他用户,同时也似乎是一个更简单的方法也有useMaps行之有效:

CsvDataFormat csv = new CsvDataFormat() 
    .setLazyLoad(true) 
    .setUseMaps(true); 

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal(csv) 
    .split(body()).streaming() 
    .to("log:mappedRow?multiline=true");