我有一个使用Spring Batch处理多个文件的场景。
我使用主步骤和分区从属步骤实现了这一步骤,该步骤通过分区程序处理每个文件 它工作正常,但现在我想存档/删除成功处理的文件。
我尝试了几种方法但没有成功:
- 在slave步骤StepExecutionListener上的afterStep方法,但是编写器正在锁定文件
- 在主步骤之后的新步骤,但我不知道如何获得成功处理的文件名,我想这是一个必须与从属步骤共享的信息,也必须考虑线程安全性。这种方法的缺点是它等待所有从属步骤结束。
提前致谢, 阿德里安
答案 0 :(得分:1)
如果您可以接受在开始删除文件之前等待所有从属步骤结束,则可以使用
来访问成功处理的文件名public class CustomTasklet implements Tasklet {
@Override
public RepeatStatus execute(final StepContribution contribution, final ChunkContext chunkContext) throws Exception {
Collection<StepExecution> stepExecutions = chunkContext.getStepContext().getStepExecution().getJobExecution().getStepExecutions();
for (StepExecution stepExecution : stepExecutions) {
if (stepExecution.getExecutionContext().containsKey("fileName")
&& ExitStatus.COMPLETED.equals(stepExecution.getExitStatus())) {
String file = stepExecution.getExecutionContext().getString("fileName");
// delete file
}
}
}
}
如果您自定义了MultiResourcePartitioner.keyName,则需要更改上面的“fileName”