传递给 FlatFileItemWriter 的每个项目的新输出文件

New Output file for each Item passed into FlatFileItemWriter

我有以下域对象。这是从我的处理器传递到我的编写器的对象。

public class DivisionIdPromoCompStartDtEndDtGrouping {

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

我想要每个 DivisionIdPromoCompStartDtEndDtGrouping 的新文件。每个文件对于列表中的每个 detailRecords 都有一行。输出文件将具有相同的格式,只是根据数据(divisionId、rpmPromoCompDetailStartDate 和 rpmPromoCompDetailEndDate)在逻辑上分开。

我如何创建一个 FlatFileItemWriter 来为每个 DivisionIdPromoCompStartDtEndDtGrouping 输出一个包含内容 detailRecords 的新文件?

我认为答案可能是一个 compositeItemWriter。那正确吗?谁能帮我举个例子。

提前致谢

不,答案不是复合作家。复合编写器简单地将它收到的所有项目转发给所有定义的子编写器。

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 必须创建一个包含所有换行符的适当字符串,以便每个详细信息都写在文件中自己的行上。

当然,您不必使用 FlatFileWriter,只需打开一个文件,使用 lineAggregator 创建行并将行保存到文件中。

你很接近。不只是 CompositeItemWriter,而是使用 ClassifierCompositeItemWriter。这与将通过分组选择编写器的 Classifier 实现相结合,将允许您每组有一个文件。您可以在此处的 javadoc 中阅读有关此 ItemReader 的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html