这是示例代码块(我删除了我们的东西并只保留了骨架代码)
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 不调用分类器复合项目处理器的前后步骤正常吗?
这是因为您使用的是复合处理器。您在一个步骤中只能注册一个项目处理器。正如您所看到的,这些方法是为复合调用的。
因此,您要么需要让复合调用委托处理器的这些方法,要么在该步骤中手动将委托处理器注册为侦听器。