From boot Spring 批量申请ItemWriter的@BeforeStep方法调用之前的ItemProcessor的@BeforeStep方法

From boot Spring Batch application @BeforeStep method of the ItemWriter calling before of @BeforeStep method of the ItemProcessor

我正在研究 Spring批处理,我在引导期间遇到问题 Spring 在 ItemProcessor 之前调用 ItemWriter。为什么?

public class PollingReader implements ItemReader<File> {
    @BeforeStep
    public void beforeStep(StepExecution stepExecution) throws NotDirectoryException {..}
    @AfterStep
    public ExitStatus afterStep(StepExecution stepExecution) {..}
}
    
public class PollingWriter implements ItemWriter<File> {
    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {..}
    @AfterStep
    public ExitStatus afterStep(StepExecution stepExecution) {..}
..
}

public class PollingProcessor implements ItemProcessor<File, File> {
    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {..}
    @AfterStep
    public ExitStatus afterStep(StepExecution stepExecution) {..}
}

并且@AfterStep ItemProcessor 的方法在方法@AfterStep ItemWriter 之前被调用。

我预计这个循环调用@BeforeStep:

但我得到了这个结果:

对于@AfterStep,我预计:

但我得到了这个结果:

谢谢:)

您的对象是多态的:它们都是项目 reader/processor/writer StepExecutionListener(更准确地说,作为代理)。当 Spring Batch 运行 StepExecutionListeners before/after 一个步骤时,它不会将它们视为 reader/processor/writer,并且它们的执行顺序不一定与在面向块的步骤中调用它们的顺序相同(实际上,在那种情况下顺序是未定义的)。