2017-05-03 41 views
0

MultiResourceItemReaderは、複数のファイルをフォルダからロードします。SpringバッチジョブでItemWriterターゲットファイル名を変更するにはどうすればよいですか?

ファイルごとに、ItemWriterが生成しているファイル名を変更したいと思います。しかし:どのように?

@Bean 
public MultiResourceItemReader<String> reader() { 
    FlatFileItemReader<String> delegate = new FlatFileItemReader<>(); 

    MultiResourceItemReader<String> r = new MultiResourceItemReader<>(); 
    r.setResources(new PathMatchingResourcePatternResolver().getResources("*.csv")); 
    r.setDelegate(delegate); 
    return r; 
} 

@Bean 
public FlatFileItemWriter<String> writer() { 
    FlatFileItemWriter<String> w = new FlatFileItemWriter<>(); 
    w.setResource(new FileSystemResource("dynamicfile.txt); //how dynamically, eg depending on the input filename? 
    w.setLineAggregator(new PassThroughLineAggregator<>()); 
    return w; 
} 

全く可能ですか?そうでない場合、どうすればItemWriterを使って別のファイルにデータを書き込むことができますか?

答えて

2

バッファリングなどの詳細については、FlatFileItemReaderインスタンスのファイル名を変更することはできません。ただし、同じことを達成するために使用できるアプローチは2つあります。 ClassifierCompositeItemWriterを使用して

ClassifierCompositeItemWriter
、あなたがに書き込みたいファイルごとに1つのFlatFileItemWriterを作成すると思います。次に、入力項目に基づいてリーダーを選択するClassifier実装を作成します。 ClassifierCompositeItemWriterは、各アイテムに使用するライターを選択するために提供するClassifierを使用します。

あなたがここに文書でClassifierCompositeItemWriter詳細を読むことができます:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html

をパーティショニングリソース
により、以下の条件が満たされた場合、あなたは同じことを処理するためにパーティショニングを使用することができます。

  1. 複数の入力ファイル
  2. 複数の出力ファイル
  3. 入力fi LESはこの場合、平行

で処理することができ、MultiResourcePartitioner同様であるPartitionerを実装するには、同じように出力ファイル情報の追加属性と、(独立MultiResourcePartitioner同じ論理を各ファイルを処理することができよく)。ステップスコープのリーダーとライターでは、入力ソースと出力先を動的に構成できます。 http://docs.spring.io/spring-batch/reference/html/scalability.html#partitioning

+0

感謝を洞察するために:

現在のパーティション分割についての詳細を読むことができます。両方とも有望ですが、次のユースケースで使用することをお勧めします:約20.000のzip形式のcsvファイル。それぞれ数MBです。すべてのファイルを読み込み、変換し(=データを取り除く)、最後に出力ファイルに書き込む必要があります。ですから、最後に出力ディレクトリに20.000のcsvファイルが必要です。どのような場合でも処理の順序は関係ありません。全体のプロセスは1日に数回実行する必要があります。この状況に最適な 'MultiResourcePartitioner'はありますか? – membersound

+1

このユースケースでパーティショニングを使用できるのであれば、私はそうするでしょう。おそらく実装が簡単で、必要に応じてさらなるスケーリングが可能です。 –

+0

私はパーティショナーを試みました、それは一般的に動作します。しかし、書き込まれたファイル名には、プロセッサ内部で最初に認識された値(ファイルの最初の行からの値)が含まれている必要があります。どのようにしてこの値を 'stepExecutionContext'として' FlatFileItemWriter'に渡して名前を考慮することができますか? – membersound

関連する問題