<Spring Batch> 1. JobParameters, ExecutionContext
by BFine
출처 : http://www.yes24.com/Product/Goods/99422216
가. JobParameters
a. Mysql 설정 유의
- Table 'batch.batch_job_instance' doesn't exist
=> 단순 datasource 설정만 할경우 배치관련 스키마가 생성되지 않기때문에 발생하는 오류
- yml 설정에 spring.batch.jdbc.initialize-schema=always 추가해야함
@Slf4j
@EnableBatchProcessing
@RequiredArgsConstructor
@Configuration
public class BatchExample {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Step step(){
return stepBuilderFactory.get("Step 이름")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
log.info(" ##### Step 실행 ##### ");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Job job(Step step){
return jobBuilderFactory.get("Job 이름").start(step).build();
}
}
b. JobParameters 전달
- JobInstance는 Job 이름과 식별 파라미터로 식별한다.
- 즉 argument가 있는 경우에는 같은 Job으로 보기때문에 재실행시에는 오류가 발생한다.
- Job에 파라미터를 전달은 JobLauncherApplicationRunner 이용해 이루어진다.
=> 책에는 JobLauncherCommandLineRunner 이지만 boot 2.3 버전부터 Deprecated 되었다.
- JobLauncherApplicationRunner 은 SpringApplication으로 부터 argument 전달 받는다.
- Converter를 통해 JobParameters로 변환되며 key값 뒤에 타입을 명시해서 사용할 수가 있다.
=> 식별 파라미터로 사용하지 않을 경우에는 -를 붙여주면 된다.
- JobParameters는 Map<String, JobParameter> 형태로 argument 값을 저장한다.
c. JobParameters 접근
- 예제의 tasklet 구현부를 보면 excute 메서드에 StepContribution과 ChunkContext를 볼 수 있다.
1. StepContribution : 커밋되지않은 현재 트랙잭션에 대한 정보를 가지고 있다.
2. ChunkContext : 실행시점에 Job 상태를 제공 및 처리중인 Chunk의 정보를 가지고 있다.
- ChunkContext에는 StepContext에 대한 참조가 있어 이를 통해 JobParameters에 접근할 수 있다.
- @Value를 이용하여 Bean 생성시에 주입해주는 방법이 있다. #{jobParameters[이름]} 형태로 사용가능
=> 이때 Scope를 사용하여 Lazy 로딩으로 Bean을 생성한다.(Step의 실행 범위에 들어갈때까지 지연)
- 메서드로 Bean을 사용할 경우에는 null을 추가해주면 되긴 하지만 먼가 보기 좋지 않다. ;;
- 아예 JobParameters를 가져오는 Bean 클래스를 만들어 주는 방법도 있다.
나. ExecutionContext
a. 무엇인가
- 배치처리는 상태를 가지고 있어야 한다.
=> ex. 어떤 Step이 실행되고 있고 어디서 실패했는지, 레코드 개수는 몇개 인지 등
- ExecutionContext는 이러한 데이터를 Key-Value 형태로 저장할 수 있는 공간이다.
=> 모든 사항들이 JobRepository에 저장되어 안전하다.
- 기본적으로 Web의 세션과 동일하지만 여러개가 존재할 수 있다는 차이가 있다.
- Job과 Step은 ExecutionContext 각각 가지며 Execution에 해당 참조를 가지고 있다.
b. 조작하는 방법
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
ExecutionContext jobExecutionContext = chunkContext.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext();
Map<String, Object> entryMap = chunkContext.getStepContext()
.getJobExecutionContext();
ExecutionContext stepExecutionContext = chunkContext.getStepContext()
.getStepExecution()
.getExecutionContext();
jobExecutionContext.put("foo","bar");
return RepeatStatus.FINISHED;
}
- ChunkContext를 통해 ExecutionContext에 접근할 수 있다.
- getJobExecutionContext() 으로 바로 Map에 접근이 가능하지만 수정해도 반영되지않는다.
=> 해당부분은 복사해서 새롭게 Map을 만들어주기 떄문이다.
c. BATCH_JOB_EXECUTION_CONTEXT 테이블
- ExecutionContext에 저장한 데이터들은 EXECUTION_CONTEXT 테이블에 저장된다.
- 위의 코드를 실행하면 SHORT_CONTEXT에 JSON 형태로 저장된다.
- SERIALIZED_CONTEXT 에는 잡이 실행 중이거나 실패한 경우에만 직렬화 객체가 저장된다.
'공부 > Spring Batch' 카테고리의 다른 글
<Spring Batch> 3. 배치 테이블 Embedded DB(H2)로 따로 관리하기 (1) | 2021.09.27 |
---|---|
<Spring Batch> 2. JobRepository, Config Customizing (0) | 2021.09.22 |
<Spring Batch> 0. 스프링 배치란? (2) | 2021.09.19 |
<Spring Batch> API 호출해서 DB에 저장하기(with JPA) (4) | 2021.03.01 |
<Spring Batch> 예제 프로그램 따라하기 (2) | 2021.02.25 |
블로그의 정보
57개월 BackEnd
BFine