因此,我第一次使用Spring Batch并尝试了解除了处理CSV文件之外的其他操作。
例如,尝试读取目录中的每个音乐文件,我有以下代码,但我不确定如何处理Delegate
部分。
@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;
}
}
目前我可以看到资源有一个音乐文件列表,但是看看我回来的堆栈跟踪,我觉得new FlatFileItemReader<>()
试图读取文件的实际内容(I&# 39;我想在某个时刻做到这一点,现在就不行了。
目前我只想要有关文件的信息(绝对路径,大小,文件名等),而不是内部的信息。
我完全错了吗?或者我只是需要配置一些不同的东西?
除了处理CSV行之外的任何代码示例都非常棒
答案 0 :(得分:1)
在搜索互联网之后,我已经设法将我认为有用的东西拉到一起......一些反馈会受到欢迎。
@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");
}
}
让我无法为文件创建自定义阅读器的部分。如果有其他人遇到过这个问题,我就是这样做的。我确信有更好的方法,但这对我有用
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);
}
}
您唯一需要做的就是实现自己的处理器。我在这个例子中使用了视频,所以我有一个视频处理器
@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;
}
}