как добавить дополнительную информацию в СТОЛБЕЦ (может быть ПОЛЕМ) short_context ТАБЛИЦЫ batch_step_context?

#spring #spring-batch #spring-batch-tasklet

#spring #spring-batch #spring-batch-tasklet

Вопрос:

1. Краткое изложение проблемы

После запуска задания я вижу ТАБЛИЦУ batch_step_context, как показано на рисунке: скриншот таблицы

Красивая информация ПОЛЯ short_context:

 {
    "batch.taskletType": "com.a.b.job.config.BundleJobConfig$$Lambda$763/0x000000080070f840",
    "batch.stepType": "org.springframework.batch.core.step.tasklet.TaskletStep"
}
  

Как я могу добавить в него дополнительную информацию?

например, после завершения задания я хочу, чтобы мое ПОЛЕ short_context было таким:

 {
    "output": "hello world",
    "batch.taskletType": "com.a.b.job.config.BundleJobConfig$$Lambda$763/0x000000080070f840",
    "batch.stepType": "org.springframework.batch.core.step.tasklet.TaskletStep"
}
  

как я могу добавить дополнительную информацию, такую как «вывод».

2. Часть моего кода

 @Configuration
public class AJobConfig {

    private final JobBuilderFactory jobBuilderFactory;

    private final StepBuilderFactory stepBuilderFactory;

    @Autowired
    public AJobConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    public Job aJob(Step aStep) {
        return jobBuilderFactory.get("aJob")
                .start(aStep)
                .build();
    }

    @Bean
    public Step aStep() {
        return stepBuilderFactory.get("aStep")
                .tasklet((contribution, chunkContext) -> {

                    System.out.println("hi");
                  
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}
  

Ответ №1:

Это действительно простой вопрос, когда я нашел полезный код на этом сайте

Часть полезного кода :

 ...
        @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        fu.closeReader();
        stepExecution
          .getJobExecution()
          .getExecutionContext()
          .put("lines", this.lines);
        logger.debug("Lines Reader ended.");
        return ExitStatus.COMPLETED;
    }
...
  

Это меня очень вдохновило.

Что мне нужно сделать, это просто добавить слушателя к шагу.

Это мой окончательный код aStep :

 ...
@Bean
    public Step aStep() {
        return stepBuilderFactory.get("aStep")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("hi");
                  
                    return RepeatStatus.FINISHED;
                })
                .listener(new StepExecutionListener() {
                    @Override
                    public void beforeStep(StepExecution stepExecution) {

                    }

                    @Override
                    public ExitStatus afterStep(StepExecution stepExecution) {
                        stepExecution
                                .getExecutionContext()
                                .put("output","hello world");

                        return ExitStatus.COMPLETED;
                    }
                })
                .build();
    }
...
  

Потому что я получаю то, что хочу, в ТАБЛИЦЕ batch_step_execution_context.

введите описание изображения здесь

Комментарии:

1. вы также можете сделать это на самом шаге (если это часть логики шага) с chunkContext.getStepContext().getStepExecution().getExecutionContext().put("output", "hello world"); помощью . Для этого не требуется прослушиватель, но вам решать, какой подход подходит для вашего варианта использования.