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 ファイルが "1 行ずつ" 読み込まれ、メモリ不足になることはありません。

ドキュメントに詳細があります: http://camel.apache.org/splitter

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