如何从StepExecutionContext获取价值

时间:2016-08-08 11:48:28

标签: spring spring-batch

我有一个弹簧批JdbcCursorItemReader。它被定义为@JobScope。请参阅下面的方法签名

@Bean
@JobScope
public JdbcCursorItemReader<MasterList> queryStagingDbReader(
        @Value("#{jobParameters['" + JobParamConstants.PARAM_FROM_DATE + "']}") Date jobFromDate,
        @Value("#{jobParameters['" + JobParamConstants.PARAM_TO_DATE + "']}") Date jobToDate) {

这个JdbcCursorItemReader是我工作中第2步的一部分。

在我工作的第一步中,我只有一个tasklet。在这个tasklet中,我正在构建一个日期列表,我希望我在第2步中了解JdbcCursorItemReader。

我最初的想法是将我的日期列表添加到我的tasklet中的stepExecutionContext中。

@Bean
@JobScope
public Tasklet createJobDatesTasklet(
        @Value("#{jobParameters['" + JobParamConstants.PARAM_FROM_DATE + "']}") Date jobFromDate,
        @Value("#{jobParameters['" + JobParamConstants.PARAM_TO_DATE + "']}") Date jobToDate) {

    return new Tasklet() {

        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
            LocalDate start = jobFromDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            LocalDate end = jobToDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

            List<LocalDate> jobDates = new ArrayList<>();
            while (!start.isAfter(end)) {
                jobDates.add(start);
                start = start.plusDays(1);
            }
            //ADDING TO CONTEXT HERE
            chunkContext.getStepContext().getStepExecution().getExecutionContext().put("jobDates", jobDates);
            return RepeatStatus.FINISHED;
        }
    };
}

然后从我的JdbcCursorItemReader中获取日期列表。但是当我尝试在我的JdbcCursorItemReader中抓取步骤执行上下文时,它告诉我它无法连接它。我认为这是因为我的bean是@JobScope。

如何从StepExecutionContext中获取日期列表,或者我可以做其他任何事情让我能够使用它?

提前致谢

1 个答案:

答案 0 :(得分:2)

您无法将其写入步骤上下文,而是将其写入作业上下文,以便作业的所有步骤都可以访问以下数据。

 StepContext stepContext         = chunkContext.getStepContext();
 StepExecution stepExecution     = stepContext.getStepExecution();
 JobExecution jobExecution         = stepExecution.getJobExecution();
 ExecutionContext jobContext     = jobExecution.getExecutionContext();

jobContext.put("jobDates", jobDates);

以下博客谈论它

http://techie-mixture.blogspot.com/2016/07/passing-values-between-spring-batch.html