2016-10-06 10 views
0

一般StepExecutionListenerを作成したいと思います。それはTaskletステップで処理されたアイテム数を記録する必要があります。春バッチタスクレットでアイテム数を更新するにはどうすればよいですか?

問題:カウントは自動的には更新されません。だから私はおそらくTasklet.execute()のどこかでこれをしなければならないでしょう。しかしどうですか?

@Bean 
    @JobScope 
    public Tasklet myTasklet() { 
     return new Tasklet() { 
      @Override 
      public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
       int count = dao.deleteByName(name); 
       //TODO how to set the count into the stepExecution context? 
       return RepeatStatus.FINISHED; 
      } 
     }; 
    } 

    @Bean 
    public Step myStep() { 
     return getStepBuilderFactory().get("myStep") 
       .listener(new StepListener()) 
       .tasklet(myTasklet()) 
       .build(); 
    } 


public class StepListener extends StepExecutionListenerSupport { 
    @Override 
    public ExitStatus afterStep(StepExecution stepExecution) { 
     long items = stepExecution.getWriteCount(); 
     logger.info("items processed in tasklet: " + items); 
     return super.afterStep(stepExecution); 
    } 
} 
+0

'stepExecution.getWriteCount()'は自動的に更新されません。それはあなたにどんな結果をもたらしますか? – Asoub

+0

タスクレット内で何個のアイテムを処理しても、「0」を返します。もちろん、これは、タスクレットから春のバッチ処理に返される項目数や何もないという事実によるものです。 – membersound

答えて

0

contribution.incrementWriteCount()おそらくあなたはstepExecution = chunkContext.getStepContext().getStepExecution()であなたの​​からStepExecutionを得ることができます

@Bean 
@JobScope 
public Tasklet myTasklet() { 
    return new Tasklet() { 
     @Override 
     public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
      int count = dao.deleteByName(name); 
      contribution.incrementWriteCount(count); // <-- 
      return RepeatStatus.FINISHED; 
     } 
    }; 
} 
0

を移動するための方法です。実行するたびにgetメソッドを作成しないように、タスクレット内にstepExecutionContextを設定する必要があります(これは単純なgetterではないと思うのでコストがかかるかもしれません)。

​​のstepExecutionの内部変数をstepExecution.setLong("yourWriteCount", count)で操作して取得できるようになりました。 (それはカスタムタスクレットかどうかは関係ありませんが、同じルールが適用されます)。

リスナーでは、同じ方法で、executeContextパラメータを使用してyourWriteCountを取得できます。

通常、executionContextはステップ全体を通して同じです。

関連する問題