我有一个处理csv文件的路由,并将它们作为记录插入到数据库中。由于它是一个巨大的csv文件而且Camel csv-splitter内存不足,我们不得不编写自己的分配器。我使用ProducerTemplate编写了拆分器。
处理csv的路线看起来有点像这样:
<route id="processCsvRoute">
<from ref="inbox" />
<to uri="bean:csvBean?method=process"/>
</route>
在csvBean中,我们进行拆分,最后为每个csv-line执行以下java代码(csv行导致产品对象)。
producer.sendBodyAndHeader("direct:csvAggregator", product, "ID", csv.getFilename());
没有csvAggregator-route选择csv:
<route id="csvAggregator">
<from uri="direct:csvAggregator" />
<aggregate strategyRef="exchangeAggregatorStrategy"
completionSize="10000"
completionInterval="10000"
parallelProcessing="true">
<correlationExpression>
<header>ID</header>
</correlationExpression>
<to uri="bean:batchInsertBean"/>
</aggregate>
</route>
有没有办法在processCsvRoute中定义聚合器?我的解决方案正在运行,但感觉不对我必须为它创建一个单独的路由。
感谢您的帮助。
答案 0 :(得分:0)
你可以在分割器上启用流模式,然后它“逐行”读取CSV文件,你就不会耗尽内存。
文档包含更多详细信息:http://camel.apache.org/splitter
<split streaming="true" ...>