传递给 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
我有以下域对象。这是从我的处理器传递到我的编写器的对象。
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