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

时间:2016-08-15 08:51:09

标签: spring spring-batch

我有以下域对象。这是从我的处理器传递给我的作者的对象。

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以使用内容detailRecords为每个DivisionIdPromoCompStartDtEndDtGrouping输出新文件?

我认为答案可能是compositeItemWriter。是对的吗?有人可以用这个例子来帮助我。

提前致谢

2 个答案:

答案 0 :(得分:1)

你很亲密。不要只使用CompositeItemWriter,而是使用ClassifierCompositeItemWriter。这与通过分组选择编写器的Classifier实现相结合,将允许您为每个组分配一个文件。您可以在此处的javadoc中详细了解此ItemReaderhttp://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html

答案 1 :(得分:0)

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

FlatFileItemWriter的问题是,你必须打开并关闭它,这是由Framwork本身处理的。

一种简单的方法是实现自己的编写器并在其write方法中使用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创建行并将该行保存到文件中。