春季批量如何计算托盘中的物品?

时间:2016-02-05 11:11:25

标签: java spring spring-batch

我有一个Tasklet,想要计算已处理的项目。然后,常见的StepExecutionListener应该能够在afterStep()中读取这些已处理的项目数:

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

如何将已处理的项目放入tasklet中的stepExecution

2 个答案:

答案 0 :(得分:3)

有两种方法可以做到:

  • 使用StepContribution
  • 增加contribution.incrementWriteCount(items);的写入次数
  • StepExecution设置写入次数。您可以从当前StepExecution访问ChunkContext。您需要致电getStepContext()以检索StepContext,然后致电getStepExecution()以检索StepExecution,最后,您可以使用setWriteCount(writeCount)设置写入次数。< / LI>

示例代码为:

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

答案 1 :(得分:0)

当您使用的是tasklet而不是chunk时,经典的“read / process / write”不适用。如果要在步骤执行中将值传递到同一步骤中的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");