如何从 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
我有一个 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