当我的Spring批处理作业完成时,我如何调用writer类的方法?



我正在开发一个Spring批处理应用程序,我有以下问题:

我有一个包含以下步骤的单步作业的定义:

@Bean
public Step readNotaryListStep(){
return steps.get("readNotaryListStep").
<Integer,Integer>chunk(1)  
.reader(serviceItemReader())
.processor(new NotaryDetailsEnrichProcessor(notaryService))
.writer(new NotaryWriter(wpService))
.build();
}
@Bean(name="updateNotaryListInfoJob")
public Job updateNotaryListInfoJob(){
return jobs.get("updateNotaryListInfoJob")
.incrementer(new RunIdIncrementer())
.start(readNotaryListStep())
.build();
}

很好。基本上,它是从读取器读取,输出被处理,最后由new NotaryWriter(wpService)写入

好吧…在作业完成之后,我需要调用一个名为的方法resetCounter()定义到我的公证作家类(为我的步骤的writer部分设置的类)。

有可能实现这样的行为吗?万一我怎么实现它呢?

您可以实现JobExecutionListener甚至StepExecutionListener,允许您在作业和步骤完成时添加回调。它们都可以通过JobBuilderStepBuilder上的listener()进行配置。

为了允许JobExecutionListener在步骤中配置的NotaryWriter的同一个实例上调用方法,您必须将NotaryWriter作为一个spring bean,而不是手动创建它,并确保JobExecutionListener和步骤都引用它。

诸如:

@Bean
public NotaryWriter notaryWriter(){
return new NotaryWriter(wpService);
}

同时注入JobExecutionListenerStep:

@Component
public MyJobExecutionListener implements JobExecutionListener {

@Autowired
private NotaryWriter notaryWriter;
public void beforeJob(JobExecution jobExecution){
}
public void afterJob(JobExecution jobExecution){
notaryWriter.resetCounter();
}
}
@Bean
public Step readNotaryListStep(NotaryWriter notaryWriter){
return steps.get("readNotaryListStep").
.........
.writer(notaryWriter)
.build();
}

我只是给你们展示一下大概的思路。您必须根据您想要做的事情来考虑JobExecutionListenerNotaryWriter的范围。它支持开箱即用的作业范围、步骤范围或仅仅是应用范围。

因为在我看来,你实际上希望每个步骤都有自己的NotaryWriter实例,这样它的计数器就不会相互混淆。如果是,您可以简单地将其定义为@StepScope,而不需要任何侦听器:

@Bean
@StepScope
public NotaryWriter notaryWriter(){
return new NotaryWriter(wpService);
}
@Bean
public Step readNotaryListStep(NotaryWriter notaryWriter){
return steps.get("readNotaryListStep").
.........
.writer(notaryWriter)
.build();
}

最新更新