我有以下域对象。这是从我的处理器传递给我的作者的对象。
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。是对的吗?有人可以用这个例子来帮助我。
提前致谢
答案 0 :(得分:1)
你很亲密。不要只使用CompositeItemWriter
,而是使用ClassifierCompositeItemWriter
。这与通过分组选择编写器的Classifier
实现相结合,将允许您为每个组分配一个文件。您可以在此处的javadoc中详细了解此ItemReader
:http://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创建行并将该行保存到文件中。