繁体   English   中英

Spring Batch 的文件处理顺序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM