0

我有一条处理 csv 文件并将它们作为记录插入数据库的路线。由于它是一个巨大的 csv 文件,并且 Camel csv-splitter 内存不足,我们不得不编写自己的拆分器。我使用 ProducerTemplate 编写了拆分器。

处理 csv 的路径看起来有点像这样:

<route id="processCsvRoute">
    <from ref="inbox" />
    <to uri="bean:csvBean?method=process"/>
</route>

在 csvBean 中,我们进行拆分,最后为每个 csv 行执行以下 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 中定义聚合器?我的解决方案有效,但感觉不对,我必须为其创建单独的路线。

谢谢你的帮助。

4

1 回答 1

0

您可以在拆分器上启用流模式,然后它会“逐行”读取 CSV 文件,并且不会耗尽内存。

该文档有更多详细信息:http ://camel.apache.org/splitter

<split streaming="true" ...>
于 2012-11-18T11:43:52.600 回答