【发布时间】:2021-07-14 14:30:05
【问题描述】:
所以我正在构建一个使用 Spring Batch 的批处理。我已经定义了一个包含几个步骤的作业,第一个是 Tasklet 的实现,它是一个文件观察器,并检查目录中是否存在与特定文件掩码匹配的任何文件。找到该文件后,我们将继续进行下一步。最初,这也是 Tasklet 的另一个实现,我们循环遍历文件和每个记录,批量加载到 Oracle。这花费的时间太长了。我发现使用 FlatFileItemReader 和 JdbcBatchItemWriter 确实快了 1000 倍。无论如何,我的问题是,当使用 FlatFileItemReader 时,我必须定义我的资源并在创建该 Bean 时提供 FileSystemResouce。我真的想在我的第一步完成后提供该文件名,因为我需要运行一个文件观察器并找出我们想要处理的文件名。有没有办法做到这一点?
@Bean
public FlatFileItemReader<PartnerRelationship> partnerRelationshipReader() throws ParseException {
FlatFileItemReader<PartnerRelationship> reader = new FlatFileItemReader<>();
reader.setResource(new FileSystemResource("/path/to/my/file/file_20210714.dat"));
reader.setBufferedReaderFactory(new CustomFileReaderFactory());
reader.setStrict(false);
reader.setLineMapper(new DefaultLineMapper<PartnerRelationship>() {{
setLineTokenizer(new FixedLengthTokenizer() {{
setNames(Constants.partnerRelationshipFields);
setColumns(Constants.partnerRelationshipIndeces);
}});
setFieldSetMapper(new PartnerRelationshipFieldSetMapper());
}});
return reader;
}
【问题讨论】:
-
我发布了一个答案,但我认为文件观察器应该在前一步而不是另一个步骤中的侦听器中实现。然后你可以通过 stepExecutionContext 而不是 JobExecutionContext 传递资源
标签: java oracle jdbc spring-batch