Spring Batch - 06. JobParameter 와 JOB_EXECUTION_PARAM 테이블

출처

목차

JobParameter

Job 을 실행할 때 함께 포함돼 사용되는 파라미터를 가진 도메인 객체

  • 하나의 Job 에 존재할 수 있는 여러개의 JobInstancee 를 구분하기 위한 용도
  • JobParameter 와 JobInstance 는 1:1 관계다.

JobParameter 생성 방법

BATCH_JOB_EXECUTION_PARAM 테이블과 매핑된다.

  • 어플리케이션 실행 시 주입
    • Java -jar LogBatch.jar requestDate=20220101
  • 코드로 실행
    • JobParameterBuilder, DefaultJobParametersConverter
  • SpEL 이용
    • @Value(“#{jobParameter[requestDate]}”), @JobScopre, @StepScope 선언 필수
    • 외부에서 전달하는 값이 표현식에 전달돼 저장된다.

@Component
public class JobParameterTest implements ApplicationRunner {

@Autowired
JobLauncher jobLauncher;

@Autowired
Job job;

@Override
public void run(ApplicationArguments args) throws Exception {

JobParameters jobParameters = new JobParametersBuilder().addString("name", "user1")
.addString("name", "user1")
.addLong("seq", 1L)
.addDate("date", new Date())
.addDouble("age", 16.5)
.toJobParameters();

jobLauncher.run(job, jobParameters);
}
}

  • StepContribution 클래스내 StepExecution 클래스내 JobExecution 클래스에서 JobParameters 객체를 관리한다.
  • ChunkContext 클래스를 통해서는 Map 객체 로 JobParameters 를 얻어올 수 있다.
  • JobParameters 객체에서 Type 별로 Key 값을 주면 Value 를 얻을 수 있다.
@RequiredArgsConstructor
@Configuration
public class JobParameterConfiguration {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;

@Bean
public Job BatchJob() {
return this.jobBuilderFactory.get("Job")
.start(step1())
.next(step2())
.build();
}

@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

JobParameters jobParameters = contribution.getStepExecution().getJobParameters();
String name = jobParameters.getString("name");
long seq = jobParameters.getLong("seq");
Date date = jobParameters.getDate("date");

System.out.println("===========================");
System.out.println("name:" + name);
System.out.println("seq: " + seq);
System.out.println("date: " + date);
System.out.println("===========================");

Map<String, Object> jobParameters2 = chunkContext.getStepContext().getJobParameters();
String name2 = (String)jobParameters2.get("name");
long seq2 = (long)jobParameters2.get("seq");

System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
Share