我正在使用Spring Batch应用程序,该应用程序读取Flat文件并返回一个object。我要做的就是使FlatFileItemReader返回一个列表并将其传递给处理器,以便将每个列表视为一个项目。请查看下面的代码段
<style>
但是我的Item处理器将列表中的每个项目视为对处理器的单个输入,并且将处理器的次数称为列表大小。如果阅读器返回的列表大小为3,则处理器将被调用3次。关于如何在ItemProcessor中处理列表输入的任何想法?
TIA
答案 0 :(得分:0)
您可以在此处找到一个商品阅读器的示例,该商品阅读器将List
个对象作为单个商品返回:https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples#multiline
答案 1 :(得分:0)
您可以编写如下所示的通用类,该类可用于一次读取多行,并将它们作为List<T>
传递给Processor,希望它会有所帮助:)
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.ResourceAwareItemReaderItemStream;
import org.springframework.core.io.Resource;
public class FlatFileItemGroupReader<T> implements ResourceAwareItemReaderItemStream<List<T>> {
private int groupSize = 100;
private static final Logger LOG = LogManager.getLogger(FlatFileItemGroupReader.class);
private FlatFileItemReader<T> fileReader;
@Override
public synchronized List<T> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
List<T> records = new ArrayList<T>();
while(records.size() < groupSize) {
T record = fileReader.read();
if (Objects.isNull(record)) {
break;
}
records.add(record);
}
if (records.isEmpty()) {
return null;
}
return records;
}
@Override
public synchronized void open(ExecutionContext executionContext) throws ItemStreamException {
fileReader.open(executionContext);
}
@Override
public void update(ExecutionContext executionContext) throws ItemStreamException {
}
@Override
public synchronized void close() throws ItemStreamException {
fileReader.close();
}
public FlatFileItemReader<T> getFileReader() {
return fileReader;
}
public void setFileReader(FlatFileItemReader<T> fileReader) {
this.fileReader = fileReader;
}
public int getGroupSize() {
return groupSize;
}
public void setGroupSize(int groupSize) {
this.groupSize = groupSize;
}
@Override
public void setResource(Resource resource) {
this.fileReader.setResource(resource);
}
}