ClassifierCompositeItemProcessor 的项目处理器中未调用之前/之后步骤

问题描述 投票:0回答:1

这是示例代码块(我删除了我们的东西并只保留了骨架代码)

public class ItemProcessor1 implements ItemProcessor{

    private StepExecution stepExecution;
        
    @BeforeStep **// Not called.**
    public void beforeStep(final StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @AfterStep  **// Not called.**
    public ExitStatus afterStep() {
       return ExitStatus.COMPLETED;
    }

    @Override
    public Record process(Record rec) throws Exception {
        return super.process(rec);
    }
}

public class ItemProcessor2 implements ItemProcessor{

    private StepExecution stepExecution;
        
    @BeforeStep  **// Not called**.
    public void beforeStep(final StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @AfterStep  **// Not called.**
    public ExitStatus afterStep() {
        return ExitStatus.COMPLETED;
    }

    @Override
    public Record process(Record rec) throws Exception {
        return super.process(rec);
    }
}

@RequiredArgsConstructor
public class ItemProcessorRecordClassifier
                            implements Classifier {

    private final ItemProcessor1 itemProcessor1;
    private final ItemProcessor2 itemProcessor2;
    public ItemProcessor classify(Record record) {
        return (record.getRowNum()%2==0) ? itemProcessor1 : itemProcessor2
    }

}

public class RecordClassifierCompositeItemProcessor extends ClassifierCompositeItemProcessor {

    private StepExecution stepExecution;
        
    @BeforeStep  // Called.
    public void beforeStep(final StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @AfterStep  // Called.
    public ExitStatus afterStep() {
        return ExitStatus.COMPLETED;
    }

    @Override
    public Record process(Record rec) throws Exception {
        return super.process(rec);
    }
}

//Config

@Bean
// @StepScope
public ItemProcessor1 itemProcessor1() {
    return new ItemProcessor1();
}

@Bean
// @StepScope
public ItemProcessor2 itemProcessor2() {
    return new ItemProcessor2();
}

@Bean
public ItemProcessorRecordClassifier itemProcessorRecordClassifier(
    final ItemProcessor1 itemProcessor1,
    final ItemProcessor2 itemProcessor2) {
    return new ItemProcessorRecordClassifier(itemProcessor1, itemProcessor2);
}

@Bean
@StepScope
public RecordClassifierCompositeItemProcessor processor(final ItemProcessorRecordClassifier itemProcessorRecordClassifier) {
    RecordClassifierCompositeItemProcessor compositeProcessor = new RecordClassifierCompositeItemProcessor();
        compositeProcessor.setClassifier(itemProcessorRecordClassifier);
        return compositeProcessor;
}

我期望在特定于记录的每个项目处理器中进行一些处理之前/之后...但是,Spring 批处理不会调用项目处理器的之前/之后步骤。我还尝试使用“StepScope”来处理两个项目处理器,但无济于事。 Spring Batch 不调用分类器复合项目处理器的前后步骤正常吗?

java spring-boot spring-batch batch-processing
1个回答
0
投票

这是因为您使用的是复合处理器。您在一个步骤中只能注册一个项目处理器。正如您所看到的,这些方法是为复合调用的。

因此,您要么需要让复合调用委托处理器的这些方法,要么在该步骤中手动将委托处理器注册为侦听器。

© www.soinside.com 2019 - 2024. All rights reserved.