[英]File processing order with Spring Batch
我有一个关于使用 Spring Batch 处理 csv 文件的顺序的问题,我有几个 csv 文件要处理,当我启动 Spring Batch 时,我不知道 Spring 以什么顺序处理这些文件。
我想知道 Spring 如何选择要处理的第一个文件? 我在哪里可以找到这个设置?
是否可以定义排序? 例如,根据文件名上写的日期处理文件? 以及如何自定义要处理的第一个文件的选择?
谢谢你们,
Spring 批处理的MultiResourceItemReader
使用Comparator<Resource>
来保持排序。 如果我们不提供比较器,则默认排序将基于文件名。 如果要自定义排序,可以编写自己的比较器逻辑,如下所示(根据上次修改时间排序)。
public class FileModifiedComparator implements Comparator<FileSystemResource>{
@Override
public int compare(FileSystemResource file1, FileSystemResource file2) {
//comparing based on last modified time
return Long.compare(file1.lastModified(),file2.lastModified());
}
}
您可以修改比较器来检查修改您的排序逻辑,例如文件名、创建等,例如: return file1.getFilename().compareTo(file2.getFilename());
或return Long.compare(file1.contentLength(),file2.contentLength());
并在MultiResourceItemReader
bean 中设置此比较器。
<bean id="fileModifiedComparator" class="FileModifiedComparator"/>
<bean id="multiResourceReader"
class=" org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="file:inputs/input*.csv" />
<property name="delegate" ref="flatFileItemReader" />
<property name="comparator" ref="fileModifiedComparator" />
</bean>
@Bean
public MultiResourceItemReader<Employee> criminalBackgroundReader() {
MultiResourceItemReader<Employee> resourceItemReader = new MultiResourceItemReader<Employee>();
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = null;
try {
resources = resolver.getResources("file:" + EmployeeInputFilePath);
} catch (IOException e) {
log.error("===== Error occurding reading input file directory: ", e);
return null;
}
resourceItemReader.setResources(resources);
resourceItemReader.setDelegate(flatFileRpReader());
resourceItemReader.setComparator(new FileComparator());
resourceItemReader.setStrict(false);
return resourceItemReader;
}
public class FileComparator implements Comparator<Resource>{
@Override
public int compare(Resource file1, Resource file2) {
//comparing based on File Name compare it to Enum-InputFileType
return InputFileType.fromString(StringUtils.substringBefore(file1.getFilename(), ".")) .compareTo(InputFileType.fromString(StringUtils.substringBefore(file1.getFilename(),"."));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.