반응형
Job
- 가장 상위 개념, 하나의 배치작업 자체
- 전체적으로 설정하고 명세한 객체
- 여러 step을 포함하고 있는 컨테이너, 반드시 한 개 이상의 step으로 구성해야 함
- 최상위 인터페이스
- 기본 구현체:
- SimpleJob: 순차적으로 step을 실행시키는 job. 모든 job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있음. steps 리스트 안에 step 객체를 가지고 있음
- FlowJob: 특정한 조건과 흐름에 따라 step을 구성하여 실행시킴, 더 유연, 조건과 흐름에 따라 구성을 다르게 할 수 있음. flow 객체를 실행히켜서 작업을 진행
JobInstance
- job이 실행될 때 만들어지는 논리적 실행 단위
- job의 설정과 구성은 동일하지만 job이 실행되는 시점에 처리하는 내용(jobParameter)은 다르기 때문에 job의 실행을 구분해야 함
- job : jobInstance = 1 : M
JobParameter
- job 실행 시 함께 포함하여 사용하는 파라미터 객체
- 하나의 job에 존재할 수 있는 여러 jobInstance를 구분하기 위한 용도
- jobParameter : jobInstance = 1 : 1
- STRING, DATE, LONG, DOUBLE 타입 제공
바인딩 방법
- jar 실행 시 주입
- java -jar dd.jar requestDate=111
- 코드로 생성
- JobParameterBuilder, DefaultJobParametersConverter
- SpEL 이용
- @Value("#{jobParameter[requestDate]}")
참고) jar 실행 시 주입 하는 방법으로 테스트 해봤더니 아래와 같은 오류가 난다.
libs % java -jar springbatch-test-0.0.1-SNAPSHOT.jar name=user3 seq(long)=1L date(date)=2021/02/03 age(double)=12.34
zsh: no matches found: seq(long)=1L
아래와 같이 escape 해주면 해결..
java -jar batch.jar executionDate\(date\)=2021/02/21
or
java -jar batch.jar 'executionDate(date)=2021/02/21'
JobExecution
- jobInstance에 대한 한 번의 시도를 의미하는 객체. job이 실행될 때 마다 생성되며 job 실행 중에 발생한 정보를 저장하는 객체
- jobExecution은 FAILED or COMPLETED 등의 job 실행 결과를 가지고 있음
- COMPLETED가 될 때 까지 하나의 jobInstance 내에서 여러번 시도가 생길 수 있음
- JobInstance : JobExecution = 1 : M
Step
- job을 구성하는 독립적인 하나의 단계로 실제 배치 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가진 객체
- 배치 작업을 어떻게 구성하고 실행할지 세부작업을 task기반으로 설정하고 명세해 놓은 객체
- 비지니스 로직을 담음
- 기본 구현체
- taskletStep : 기본이 되는 클래스, 구현체 제어
- partitionStep : 멀티 스레드 방식, step을 여러 개로 분리해서 실행
- jobStep : step 내에서 job을 실행하도록 함, chaining
- flowStep : step 내에서 flow를 실행하게 함
StepExecution
- step에 대한 한 번의 시도를 의미하는 객체, step 실행 중에 발생한 정보를 저장하는 객체
- 각 step별로 생성, step이 실제로 시작되었을 때만 생성
- job이 실패해 재시작하더라도 이미 성공한 step은 재실행되지 않고 실패한 step만 실행됨(실패하면 그 이후 step은 실행되지 않고 종료)
- 모든 stepExecution이 성공해야 jobExecution도 정상적으로 완료
- JobExecution : StepExecution = 1 : M
StepContribution
- 청크 프로세스의 변경사항을 버퍼링한 수 stepExecution상태를 업데이트하는 도메인 객체
- 청크 커밋 직전에 stepExecution의 apply 메서드를 호출하여 상태를 업데이트
- exitStatus의 기본 종료토드 외 사용자 정릐 종료코드를 생성해서 적용할 수 있음
- stepExecution 객체 안에 있음
ExecutionContext
- map의 형태로 stepExecution 이나 jobExecution 객체의 상태를 저장하는 공유 객체; 유지 관리에 필요한 키-값 저장
- DB에는 직렬화 한 값으로 저장됨({"키":"값"})
- 공유 범위
- step: 각 step의 stepExecution에 저장되며 step간 공유 안 됨
- job: 각 job의 jobExecution에 저장되며 job간 공유 안되고 job의 step간에는 서로 공유 됨
- job 재시작 시 이미 처리한 데이터는 건너뛰고 이후를 수행하도록할 때 상태정 보를 활용
JobRepository
- 배치 작업 중 정보를 저장하는 저장소, 인터페이스; simpleJobRepository 구현체 있고, 커스텀 가능
- job이 언제 수행되었고 언제 끝났고 몇 번 실행되었고 등 메타데이터를 저장함
- @EnableBatchProcessing 어노테이션만 선언하면 job repository가 자동으로 빈으로 생성됨
- jdbc 방식
- JobRepostioryFactoryBean
- 내부적으로 aop를 통해 트랜잭션 처리 해주고 있음
- 트랜잭션 isolation 기본 값은 serializable로 최고 수준이지만 다른 레벨로도 지정 가능
- 메타테이블 테이블 prefix가 기본으로는 BATCH_ 이지만 수정 가능
- in memory 방식
- MapJobRepositoryFactoryBean
- 성능 등의 이유로 굳이 DB에 넣고 싶지 않은 경우
- test나 프로토타입의 빠른 개발이 필요할 때 사용
JobLauncher
- job을 실행하는 역할
- job과 JobParameter를 인자로 받아 요청된 배치 작업을 수행한 후 jobExecution을 반환
- 부트가 구동되면 jobLauncher 빈이 자동 생성됨
- job 실행
- 동기적 실행: SyncTaskExecutor
- 모든 단계를 다 마친 후에 jobExecution 반환
- 스케줄러에 의한 배치 처리에 적합
- 배치 처리 시간이 길어도 상관 없을 경우
- 비동기적 실행: SimpleAsyncTaskExecutor
- jobExecution을 생성하고 획득, 획득하자마자 반환(exitStauts.UNKNOWN) , 배치 완료
- http 요청에 의한 배치처리에 적합; 배치처리 시간이 길 경우 응답이 늦어지지 않도록 함
- 동기적 실행: SyncTaskExecutor
728x90
반응형
'개발 > spring-batch' 카테고리의 다른 글
[spring-batch] 소개 (0) | 2023.12.04 |
---|---|
[spring-batch] simpleJob (0) | 2022.05.26 |
[spring-batch] application.yml 설정 값 (0) | 2022.05.25 |
[spring-batch] h2 연결 및 설정 (0) | 2022.05.23 |
[spring-batch] 기초 (0) | 2022.05.20 |