2016-02-05 85 views
0

我有一個Tasklet,並希望計算處理的項目。然後共同StepExecutionListener應該能夠讀取afterStep()那些加工項目計數:如何在春季批次中計算Tasket中的項目?

@Bean 
public Step myStep() { 
    return stepBuilderFactory.get("Step2") 
      .tasklet(new Tasklet() { 
       @Override 
       public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
        int items = dao.deleteItems(); //how to pass these items to a StepExecutionListener? 
        return RepeatStatus.FINISHED; 
       } 
      }) 
      .build(); 


@Component 
public class MyListener extends StepExecutionListenerSupport { 
    @Override 
    public ExitStatus afterStep(StepExecution stepExecution) { 
     long items = stepExecution.getWriteCount(); 
     return super.afterStep(stepExecution); 
    } 
} 

我如何能得到處理的項目到微進程中的stepExecution

+0

This [Tutorial](http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps)可能會對您有所幫助。 – Braj

回答

3

有兩種方法做到這一點:

  • 增量從StepContribution寫入次數與contribution.incrementWriteCount(items);
  • 將寫入次數從StepExecution。您可以從當前的ChunkContext訪問StepExecution。您需要撥打getStepContext()以檢索StepContext,然後撥打getStepExecution()檢索StepExecution,最後,您可以使用setWriteCount(writeCount)設置寫入計數。

示例代碼將是:

public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
    int items = dao.deleteItems(); 
    contribution.incrementWriteCount(items); 
    // OR: chunkContext.getStepContext().getStepExecution().setWriteCount(items); 
    return RepeatStatus.FINISHED; 
} 
0

由於您使用的是微進程,而不是一個塊,經典的「讀/工藝/寫」不適用。如果你想從你的步執行同一步轉移值到stepExecutionListener ,後來乾脆把鍵/值在stepExecutionContext:

int items=dao.deleteItems(); 
    chunkContext.getStepContext().getStepExecution().getExecutionContext().putInt("MYKEY", items); 

在你StepExecutionListener AfterStep的(StepExecution stepExecution)方法:

ExecutionContext executionContext = stepExecution.getExecutionContext(); 
int items = executionContext.getInt("MYKEY");