我正在开发一个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
,允许您在作业和步骤完成时添加回调。它们都可以通过JobBuilder
和StepBuilder
上的listener()
进行配置。
为了允许JobExecutionListener
在步骤中配置的NotaryWriter
的同一个实例上调用方法,您必须将NotaryWriter
作为一个spring bean,而不是手动创建它,并确保JobExecutionListener
和步骤都引用它。
诸如:
@Bean
public NotaryWriter notaryWriter(){
return new NotaryWriter(wpService);
}
同时注入JobExecutionListener
和Step
:
@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();
}
我只是给你们展示一下大概的思路。您必须根据您想要做的事情来考虑JobExecutionListener
和NotaryWriter
的范围。它支持开箱即用的作业范围、步骤范围或仅仅是应用范围。
因为在我看来,你实际上希望每个步骤都有自己的NotaryWriter
实例,这样它的计数器就不会相互混淆。如果是,您可以简单地将其定义为@StepScope
,而不需要任何侦听器:
@Bean
@StepScope
public NotaryWriter notaryWriter(){
return new NotaryWriter(wpService);
}
@Bean
public Step readNotaryListStep(NotaryWriter notaryWriter){
return steps.get("readNotaryListStep").
.........
.writer(notaryWriter)
.build();
}