Spring批次的文件处理顺序

File processing order with Spring Batch

我对使用 Spring 批处理处理 csv 文件的顺序有疑问,我有几个 csv 文件要处理,当我启动 spring 批处理时,我不知道按什么顺序处理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(),"."));
}
}