0

目標は、Camel 3.0.0 を使用して 2 つの CSV ファイルを比較することにより、1 時間ごとにレポートを作成することです。1 つは FTP サーバー上にあり、もう 1 つはディスク上にあります。Bindy Dataformat を使用してディスク上の CSV をアンマーシャリングすることと組み合わせてポーリング エンリッチ パターンを使用するにはどうすればよいですか?

コード例 (簡単にするために、FTP エンドポイントをファイル エンドポイントに置き換えます):

@Component
public class EnricherRoute extends RouteBuilder {
    @Override
    public void configure() {
        from("file://data?fileName=part_1.csv&scheduler=quartz2&scheduler.cron=0+0+0/1+*+*+?")
            .unmarshal().bindy(BindyType.Csv, Record.class)
            .pollEnrich("file://data?fileName=part_2.csv", new ReportAggregationStrategy())
            .marshal().bindy(BindyType.Csv, Record.class)
            .to("file://reports?fileName=report_${date:now:yyyyMMdd}.csv");

    }
}

この例の問題はReportAggregationStrategyresource(から来ているdata/part_2.csv、以下を参照) が非整列化されていないことです。非整列化する方法data/part_2.csvも?

public class ReportAggregationStrategy implements AggregationStrategy {
    @Override
    public Exchange aggregate(Exchange original, Exchange resource) {
        final List<Record> originalRecords = original.getIn().getBody(List.class);
        final List<Record> resourceRecords = resource.getIn().getBody(List.class); // Results in errors!

        ...
    }
}
4

1 に答える 1

2

エンリッチメントを直接エンドポイントでラップし、そこでアンマーシャリングを行うことができます。

from("file://data?fileName=part_1.csv&scheduler=quartz2&scheduler.cron=0+0+0/1+*+*+?")
    .unmarshal().bindy(BindyType.Csv, Record.class)
    .enrich("direct:enrich_record", new ReportAggregationStrategy())
    .marshal().bindy(BindyType.Csv, Record.class)
    .to("file://reports?fileName=report_${date:now:yyyyMMdd}.csv");

from("direct:enrich_record")
    .pollEnrich("file://data?fileName=part_2.csv")
    .unmarshal().bindy(BindyType.Csv, Record.class);
于 2020-01-05T23:17:03.877 に答える