下面是定制的平面文件项目读取器的代码,该读取器可以读取多个项目
public class MultipleItemsFlatFileReader<T> implements ItemReader<List<T>>, ItemStream {
private FlatFileItemReader<T> reader;
private int fetchSize;
public void setReader(String readerName, String filePath, String[] headers, int[] includedFileds,
Class<? extends T> c, int fetchSize) {
this.reader = CustomFlatFileReader.getReader(readerName, filePath, headers, includedFileds, c);
this.fetchSize = fetchSize;
}
@Override
public List<T> read() throws Exception{
List<T> items = new ArrayList<>();
for (int count = 0; count < this.fetchSize; count++) {
T item = reader.read();
if (item == null) {
break;
}
items.add(item);
}
if (!items.isEmpty()) {
return items;
}
return null;
}
@Override
public void open(ExecutionContext executionContext) {
reader.open(executionContext);
}
@Override
public void update(ExecutionContext executionContext) {
reader.update(executionContext);
}
@Override
public void close() {
reader.close();
}
}
下面是自定义项目编写者的代码
public class MultipleItemsCompositeJdbcWriter<T> implements ItemWriter<List<T>> {
private List<JdbcBatchItemWriter<T>> delegates;
public void setDelegates(List<JdbcBatchItemWriter<T>> writers) {
this.delegates = writers;
}
@Override
public void write(List<? extends List<T>> items) throws Exception {
for (JdbcBatchItemWriter<T> writer: delegates) {
for (List<T> item: items) {
writer.write(item);
}
}
}
}
我是春季批处理的新手。此代码正确吗?我可能会缺少任何用例吗?目前,我的批处理作业是按顺序执行的,但将来可能会使用多线程和分区。
需要这样做的是,我需要在处理器中进行数据库查找。对多个项目进行查找比对单个项目进行查找更好。
答案 0 :(得分:0)
Is this code correct?
答案取决于您的工作规格。在您的情况下,看起来一个项目是平面文件中多个物理行的逻辑组。
对于读者而言,文档中的以下部分会有所帮助:https://docs.spring.io/spring-batch/4.0.x/reference/html/common-patterns.html#multiLineRecords
此用例还有两个示例:
对于编写者,您可以使用CompositeItemWriter
与多个编写者一起编写项目。此处有更多详细信息:https://docs.spring.io/spring-batch/4.0.x/api/org/springframework/batch/item/support/CompositeItemWriter.html