我正在開發 Spring Batch 應用程式,但遇到以下問題。
我有包含此步驟的單步作業的定義:
@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();
}
它作業正常。基本上它是從讀取器讀取,輸出被處理,最后由我為寫入器創建的新 NotaryWriter(wpService)寫入。
好的...現在出現了以下需求:在 Job 完成之后,我需要呼叫一個名為resetCounter()的方法,該方法定義在我的NotaryWriter類(為我的步驟的 writer 部分設定的類)中。
是否有可能實作這樣的行為?萬一我該如何實施?
uj5u.com熱心網友回復:
您可以實作JobExecutionListener甚至StepExecutionListener允許您在作業和步驟完成時添加回呼。他們都可以通過配置listener()上的JobBuilder和StepBuilder。
要允許在 step 中配置JobExecutionListener的同一實體上呼叫方法NotaryWriter,您必須將 makeNotaryWriter作為 spring bean 而不是手動創建它,并確保 theJobExecutionListener和 step 都參考它。
喜歡的東西:
@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這樣它的計數器就不會相互混淆。如果是,您可以簡單地將其定義為 the@StepScope并且不需要任何偵聽器:
@Bean
@StepScope
public NotaryWriter notaryWriter(){
return new NotaryWriter(wpService);
}
@Bean
public Step readNotaryListStep(NotaryWriter notaryWriter){
return steps.get("readNotaryListStep").
.........
.writer(notaryWriter)
.build();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/335983.html
