728x90
용어 설명
@Configuration 선언
- 하나의 배치 Job을 정의하고 빈으로 설정한다
JobBuilderFactory
- Job을 생성하는 빌더 팩토리
StepBuilderFactory
- Step을 생성하는 빌더 팩토리
Job
- Job 생성
Step
- Step 생성
tasklet
- step 안에서 단일 테스크로 수행되는 로직 구현
- 비즈니스 로직이 포함되어 있다.
Job 구동 → Step 실행 → Tesklet 실행
Job은 여러개의 Step으로 구성되어 있고, Step은 Tasklet(기능)으로 구성되어 있다. 배치 작업 하나가 Job에 해당된다.
Job 정의하기
@Configuration
@RequiredArgsConstructor
public class HelloJobConfiguration { // Job 정의
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloJob() {
return jobBuilderFactory.get("helloJob") // Job 생성
.start(helloStep1())
.next(helloStep2())
.build();
}
@Bean
public Step helloStep1() {
return stepBuilderFactory.get("helloStep1") // Step 생성
.tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED)
.build();
}
@Bean
public Step helloStep2() {
return stepBuilderFactory.get("hellop2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("==========================");
System.out.println(" spring hello step 2");
System.out.println("==========================");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
step에서 tasklet을 무한 반복 시킨다. 그래서 RepeatStatus.FINISHED 또는 null을 반환하면 한 번만 실행된다.
Job 실행하기
실행 시켰더니 에러가 발생했다.
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BATCH_JOB_INSTANCE" not found; SQL statement:
SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ? [42102-214]
batch를 위한 기본 테이블이 생성되지 않아서 발생한 문제다.
properties 인 경우
spring.batch.initialize-schema=always
yml 파일 인 경우
spring:
batch:
jdbc:
initialize-schema: always
설정을 하고나서 실행시켰더니 잘 실행됐다.
728x90
'[ Spring ] > Batch' 카테고리의 다른 글
[Batch] 도메인 객체 이해 (0) | 2022.11.23 |
---|---|
[Batch] DB 스키마 생성 및 메타 데이터 테이블 (0) | 2022.11.20 |
[Batch] 스프링 배치 초기화 설정 클래스 (0) | 2022.10.22 |