2016-08-15 2 views
0

私は以下のドメインオブジェクトを持っています。これは私のプロセッサーから私の作家に渡されるオブジェクトです。FlatFileItemWriterに渡される各アイテムの新しい出力ファイル

public class DivisionIdPromoCompStartDtEndDtGrouping { 

    private int divisionId; 
    private Date rpmPromoCompDetailStartDate; 
    private Date rpmPromoCompDetailEndDate; 
    private List<MasterList> detailRecords = new ArrayList<MasterList>(); 

DivisionIdPromoCompStartDtEndDtGroupingごとに新しいファイルが必要です。各ファイルには、リスト内の各detailRecordの行があります。出力ファイルは、データ(divisionId、rpmPromoCompDetailStartDateおよびrpmPromoCompDetailEndDate)に基づいて論理的に区切られた同じフォーマットのものです。

各detailIdPromoCompStartDtEndDtGroupingのコンテンツファイルdetailRecordsに新しいファイルを出力するために、FlatFileItemWriterを作成するにはどうすればよいですか?

私は答えがcompositeItemWriterかもしれないと思います。そうですか?誰かが私にこの事例を手伝ってもらえますか?

ありがとうございました

答えて

1

もうすぐです。 CompositeItemWriterの代わりにClassifierCompositeItemWriterを使用してください。これはグループ化によってライターを選択するClassifierの実装と組み合わせると、グループごとに1つのファイルを持つことができます。この詳細については、ItemReaderのjavadocを参照してください。http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html

+0

ありがとうございました。私はClassifierCompositeItemWriterを使って目標を達成しました。 Java Configを使用してそのクラスを使用する方法の例を見つけることは、本当に難しいものでした。誰でももっと多くのJavaの設定例を教えてもらえますか? – Richie

0

いいえ、答えは合成ライターではありません。複合ライターは、受け取ったすべてのアイテムをすべての定義済みの子ライターに転送します。

FlatFileItemWriterの問題は、あなたがそれを開いて閉じなければならないということです。これはFramwork自体によって処理されます。

簡単なアプローチは、独自のライターを実装し、その書き込みメソッドでFlatFileWriterを使用することです。

public class MyWriter implements ItemWriter<..>{ 

    public void write(List<..> items) { 
    for (.. item:items) { 
     FlatFileItemWriter fileWriter = new FlatFileItemWriter(); 
     fileWriter.setResource(...); // unique FileName 
     fileWriter.setLineAggregator(...); 
     fileWriter.... ; // do other settings if necessary 
     fileWriter.afterPropertiesSet(); 

     fileWriter.open(new ExecutionContext()); 

     fileWriter.write(Collections.singleList(item)); 

     fileWriter.close(); 
    }  
    } 
} 

lineAggregatorはeveryDetailがファイルに独自の行に書かれているように、すべての改行を含む適切な文字列を作成する必要があります。

もちろん、FlatFileWriterを使用せずにファイルを開くだけで、lineAggregatorを使って行を作成し、行をファイルに保存することができます。

関連する問題