我正在探索Spring批处理,并且我有一个问题说明,要求我从db中读取,将这些数据转换为逗号分隔的形式并写入文件。我有大约50个不同的查询和要创建的文件数量。这些查询很少返回巨大的数据,这些数据可能会使我的文件变大。我正在用Spring Batch解决此问题,并且总体上很少有关于Spring Batch的查询。
BeanWrapperFieldExtractor<StudentDTO> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[] {"name", "emailAddress", "purchasedPackage"});
lineAggregator.setFieldExtractor(extractor);
例如,如果我需要做诸如StudentDto.getName()。replace(“ a”,“”)之类的事情。在这种情况下我应该去定制处理器吗?
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if (stepExecution.getStatus() == "COMPLETED") {
fileWriter.write("headerString");
Path path = Paths.get("encryptedTextFileThreaded.txt");
try (BufferedWriter fileWriter = Files.newBufferedWriter(path)) {
for(Line line: studentDtoLines)
{
fileWriter.write(line.getLine());
fileWriter.newLine();
}
fileWriter.write("footerString");
}
catch (Exception e) {
log.error("Fatal error: error occurred while writing {} file",path.getFileName());
}
}
答案 0 :(得分:1)
- 当我需要转换特定的字段值时,可以使用字段提取器吗?在这种情况下我应该去定制处理器吗?
我将使用处理器进行数据转换。这是项目处理器的典型用例。优良作法是使每个组件做一件事情(并做得很好):使用字段提取器提取字段,并使用项目处理器进行转换。这对于测试和可重用性来说更好。
- 在这种情况下,一项包含50个步骤并并行处理的工作是一种合适的方法吗?
出于可重新启动性的考虑,IMO为每个文件提供一个作业是更好的选择。当文件处理失败时,最好(和更干净)地为该特定文件重新启动失败的作业,而不是相同的作业,并跳过49个步骤。您始终可以通过在JobLauncher
上使用适当的任务执行程序来并行运行多个作业。
- 将标头写到文件顶部而不是使用FlatFileHeaderCallback-下面的写文件方式可以接受吗?
不,这是对监听器的错误使用。我将使用页眉/页脚回调进行页眉/页脚写入,并使用面向块的步骤来写入文件的内容。
- 多线程步骤用于加快单个步骤。如果我有一个包含50个步骤的Job,但它们中的任何一个都不相互依赖,则可以采用并行处理来加快Job的执行速度。真正?这是否意味着Spring Batch可以创建50个线程并在Paralle中运行所有线程?
是的。您可以在并行流上设置的TaskExecutor
中配置并行度。有关更多详细信息,请参见Parallel steps。