Spring批处理-获取有关目录中文件的信息
所以我第一次玩弄SpringBatch,试图了解如何处理CSV文件以外的事情 例如,尝试读取目录中的每个音乐文件时,我有以下代码,但我不确定如何处理Spring批处理-获取有关目录中文件的信息,spring,spring-batch,Spring,Spring Batch,所以我第一次玩弄SpringBatch,试图了解如何处理CSV文件以外的事情 例如,尝试读取目录中的每个音乐文件时,我有以下代码,但我不确定如何处理委托部分 @Configuration @EnableBatchProcessing public class BatchConfiguration { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuil
委托
部分
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public MusicItemProcessor processor() {
return new MusicItemProcessor();
}
@Bean
public Job readFiles() {
return jobBuilderFactory.get("readFiles").incrementer(new RunIdIncrementer()).
flow(step1()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<String, String>chunk(10)
.reader(reader())
.processor(processor()).build();
}
@Bean
public ItemReader<String> reader() {
Resource[] resources = null;
ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
try {
resources = patternResolver.getResources("file:/music/*.flac");
} catch (IOException e) {
e.printStackTrace();
}
MultiResourceItemReader<String> reader = new MultiResourceItemReader<>();
reader.setResources(resources);
reader.setDelegate(new FlatFileItemReader<>()); // ??
return reader;
}
}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
公共音乐处理器(){
返回新的MusicItemProcessor();
}
@豆子
公共作业读取文件(){
返回jobBuilderFactory.get(“readFiles”).incrementer(新的RunIdIncrementer())。
流程(步骤1()).end().build();
}
@豆子
公共步骤第1步(){
返回stepBuilderFactory.get(“step1”).chunk(10)
.reader(reader())
.processor(processor()).build();
}
@豆子
公共项目阅读器(){
Resource[]resources=null;
ResourcePatternResolver patternResolver=新路径匹配ResourcePatternResolver();
试一试{
resources=patternsolver.getResources(“文件:/music/*.flac”);
}捕获(IOE异常){
e、 printStackTrace();
}
MultiResourceItemReader=新的MultiResourceItemReader();
reader.setResources(resources);
setDelegate(新的FlatFileItemReader());/??
返回读取器;
}
}
目前我可以看到resources有一个音乐文件列表,但看看我得到的stacktrace,我觉得new FlatFileItemReader()
正在尝试读取文件的实际内容(我想在某个时候这样做,只是现在不想)
目前,我只想要有关文件的信息(绝对路径、大小、文件名等),而不是里面的信息
我是不是完全错了?还是我只需要配置一些不同的东西
任何不仅仅处理CSV行的代码示例都将非常棒在浏览了互联网之后,我成功地收集了一些我认为有效的东西。。。欢迎提供一些反馈
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public VideoItemProcessor processor() {
return new VideoItemProcessor();
}
@Bean
public Job readFiles() {
return jobBuilderFactory.get("readFiles")
.start(step())
.build();
}
@Bean
public Step step() {
try {
return stepBuilderFactory.get("step").<File, Video>chunk(500)
.reader(directoryItemReader())
.processor(processor())
.build();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Bean
public DirectoryItemReader directoryItemReader() throws IOException {
return new DirectoryItemReader("file:/media/media/Music/**/*.flac");
}
}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
公共VideoItemProcessor(){
返回新的VideoItemProcessor();
}
@豆子
公共作业读取文件(){
返回jobBuilderFactory.get(“readFiles”)
.start(步骤())
.build();
}
@豆子
公共步骤(){
试一试{
返回stepBuilderFactory.get(“step”).chunk(500)
.reader(directoryItemReader())
.processor(处理器())
.build();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@豆子
public DirectoryItemReader DirectoryItemReader()引发IOException{
返回新的DirectoryItemReader(“文件:/media/media/Music/***.flac”);
}
}
让我不得不为文件创建自定义读取器的部分。如果有人遇到这件事,我就是这样做的。我相信有更好的方法,但这对我来说很有效
public class DirectoryItemReader implements ItemReader<File>, InitializingBean {
private final String directoryPath;
private final List<File> foundFiles = Collections.synchronizedList(new ArrayList<>());
public DirectoryItemReader(final String directoryPath) {
this.directoryPath = directoryPath;
}
@Override
public File read() {
if (!foundFiles.isEmpty()) {
return foundFiles.remove(0);
}
synchronized (foundFiles) {
final Iterator files = foundFiles.iterator();
if (files.hasNext()) {
return foundFiles.remove(0);
}
}
return null;
}
@Override
public void afterPropertiesSet() throws Exception {
for (final Resource file : getFiles()) {
this.foundFiles.add(file.getFile());
}
}
private Resource[] getFiles() throws IOException {
ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
return patternResolver.getResources(directoryPath);
}
}
公共类DirectoryItemReader实现ItemReader,初始化bean{
私有最终字符串directoryPath;
private final List foundFiles=Collections.synchronizedList(new ArrayList());
public DirectoryItemReader(最终字符串目录路径){
this.directoryPath=directoryPath;
}
@凌驾
公共文件读取(){
如果(!foundFiles.isEmpty()){
返回foundFiles。删除(0);
}
已同步(查找文件){
final Iterator files=foundFiles.Iterator();
if(files.hasNext()){
返回foundFiles。删除(0);
}
}
返回null;
}
@凌驾
public void afterPropertieSet()引发异常{
对于(最终资源文件:getFiles()){
这个.foundFiles.add(file.getFile());
}
}
私有资源[]getFiles()引发IOException{
ResourcePatternResolver patternResolver=新路径匹配ResourcePatternResolver();
返回patternsolver.getResources(directoryPath);
}
}
你唯一需要做的就是实现你自己的处理器。我在这个例子中使用了视频,所以我有一个视频处理器
@Slf4j
public class VideoItemProcessor implements ItemProcessor<File, Video> {
@Override
public Video process(final File item) throws Exception {
Video video = Video.builder()
.filename(item.getAbsoluteFile().getName())
.absolutePath(item.getAbsolutePath())
.fileSize(item.getTotalSpace())
.build();
log.info("Created {}", video);
return video;
}
}
@Slf4j
公共类VideoItemProcessor实现ItemProcessor{
@凌驾
公共视频进程(最终文件项)引发异常{
视频=Video.builder()
.filename(item.getAbsoluteFile().getName())
.absolutePath(项.getAbsolutePath())
.fileSize(item.getTotalSpace())
.build();
log.info(“创建{}”,视频);
返回视频;
}
}
如果是这样,FlatFileItemReader不适合您。在这种情况下,您需要类似DirectorReader的东西,它只返回文件(元数据)列表。然后在处理器中处理文件内容…这是一个很好的起点,我不知道应该使用哪个阅读器,谢谢。但是,我实际上找不到有关DirectorReader
的任何信息?尝试一下,这并不能真正帮助解释如何处理文件列表。。。回到你说我不应该使用的东西,FlatFileItemReader
?