#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");
помощью . Для этого не требуется прослушиватель, но вам решать, какой подход подходит для вашего варианта использования.