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(),"."));
}
}
我对使用 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(),"."));
}
}