如何从 StepExecutionContext 获取值

How to get value from StepExecutionContext

我有一个 spring 批处理 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 步的一部分。

在我工作的第 1 步中,我只有一个 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 中获取我的日期列表,或者我可以做任何其他事情来使这项工作对我有用吗?

提前致谢

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

 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