簡體   English   中英

如何更新Spring-Batch Tasklet中的項目計數?

[英]How to update item count in spring-batch Tasklet?

我想創建一個通用的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);
    }
}

contribution.incrementWriteCount()可能是要走的路

@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;
        }
    };
}

你可以得到StepExecution從您execute()stepExecution = chunkContext.getStepContext().getStepExecution() 您應該在Tasklet中設置stepExecutionContext,以防止在每次執行時都使用get方法(這可能代價很高,因為我認為這些並不是簡單的getter)。

現在,您可以在stepExecution execute()使用stepExecution.setLong("yourWriteCount", count)來操縱stepExecution的內部變量,並對其進行相同操作。 (這是否是自定義tasklet都沒有關系,適用相同的規則)。

在偵聽器中,可以以相同的方式通過executionContext參數獲取yourWriteCount

通常,整個過程中的executionContext是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM