반응형
스프링 배치 실행 - Step
StepBuilderFactory
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
- StepBuilder를 생성하는 팩토리 클래스,
get(String name)
메서드를 제공한다.
StepBuidler
- Step을 구성하는 설정 조건에 따라 다섯개의 하위 빌더 클래스를 생성하고, Step 생성을 위임한다.
- TaskletStepBuilder
- TaskletStep을 생성하는 기본 빌더 클래스
- SimpleStepBuilder
- TaskletStep을 생성하며 내부적으로 청크기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성한다.
- PartitionStepBuilder
- PartitionStep을 생성하며 멀티 스레드 방식으로 Job을 실행한다.
- JobStepBuilder
- JobStep을 생성하여 Step 안에서 Job을 실행한다.
- FlowStepBuilder
- FlowStep을 생성하여 Step 안에서 Flow를 실행한다.
TaskletStep
@Bean
public Step taskStep() {
return stepBuilderFactory.get("taskStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step was executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
- 스프링 배치에서 제공하는 Step의 구현체, Tasklet을 실행시키는 도메인 객체이다.
RepeatTemplate
를 사용해서 Tasklet의 구문을 트랜젝션 경계 내에서 반복 실행한다.Task
기반과Chunk
기반으로 실행 단위가 나뉜다.
Task 기반 Step
- ItemReader과 ItemWriter와 같은 청크 기반의 작업보다 단일 작업 기반으로 처리되는 것이 더 효율적인 경우 사용한다.
- 주로 Tasklet 구현체를 만들어서 사용한다.
대량 처리를 하는 경우 chunk기반에 비해 더 복잡한 구현이 필요
하다.
chunk 기반 Step
- 하나의 큰 덩어리를 n개씩 나눠서 실행한다는 의미
대량 처리를 하는 경우 효과적
으로 설계된다.ItemReader
,ItemProcessor
,ItemWriter
를 사용한다.- 청크 기반 전용 Tasklet인
ChunkOrientedTasklet
구현체가 제공된다.
API
stepBuilderFactory.get()
:StepBuilder
를 생성하는 팩토리, Step의 이름을 매개변수로 받는다.tasklet(Tasklet)
: Tasklet 클래스 설정,TaskletStepBuidler
를 반환한다.startLimit(Integer)
: Step의 실행 횟수를 설정한다. 설정한 만큼 실행되고 초과시 오류를 발생한다.- 기본값:
INTEGER.MAX_VALUE
- Step의 실행 횟수를 조정할 수 있다.
- Step마다 설정할 수 있다.
- 설정 값을 초과해서 다시 실행하려고 하면
StartLimitExceededException
이 발생한다. - startLimit의 디폴트 값으
Integer.MAX_VALUE
- 기본값:
allowStartIfComplete(Boolean)
: Step의 성공, 실패와 상관없이 Step을 실행하기 위한 설정- 재시작 가능한 Job에서 Step의 이전 성공 여부와 상관없이 항상 step을 실행하기 위한 설정이다.
- 실행마다 유효성을 검증하는 Step이나 사전 작업이 꼭 필요한 Step 등에 사용한다.
- 기본적으로 COMPLETED상태를 가진 Step은 Job 재시작시 실행하지 않고 스킵한다.
allowStartIfComplete
가true
로 설정된 Step은 항상 실행한다.
listener(StepExecutionListner)
: Step 라이프사이클의 특정 시점에 콜백 제공받도록StepExcutionListener
을 설정한다.build()
:TaskletStep
생성
Tesklet
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
return RepeatStatus.FINISHED;
})
.build();
}
- Step 내에서 구성되고 실행되는 도메인 객체로, 주로 단일 테스크를 수행하기 위해 사용한다.
- TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행하거나 종료한다.
RepeatStatus
: Tasklet의 반복 여부 상태 값RepeatStatus.FINISHED
: Tasklet 종료, RepeatStatus를 null로 반환하면RepeatStatus.FINISHED
으로 해석된다.RepeatStatus.CONTINUABLE
: Tasklet 반복- RepeatStatus.FINISHED가 리턴되거나 실패 예외가 던져지기 전까지 TaskletStep에 의해 while문 안에서 반복적으로 호출된다.
- 익명 클래스 또는 구현 클래스를 만들어서 사용한다.
- Tasklet()메서드를 실행하게 되면 TaskletStepBuilder가 반환되어 관련된 API를 설정할 수 있다.
- Step에 오직 하나의 Tasklet 설정이 가능하며, 두개 이상을 설정할 경우 마지막에 설정한 객체가 실행된다.
JobStep
@Bean
public Step jobStep(JobLauncher jobLauncher) {
return stepBuilderFactory.get("jobStep")
.job(childJob())
.launcher(jobLauncher)
.parametersExtractor(jobParametersExtractor())
.build();
}
- Job에 속하는 Step중 외부의 Job을 포함하고 있는 Step
- 외부의 Job이 실패하면 해당 Step이 실패하므로 결국 최종 기본 Job도 실패하게 된다.
- 모든 메타데이터는 기본 Job과 외부 Job별로 각각 저장된다.
- 커다란 시스템을 모듈로 쪼개고 흐름관리를 위해 사용한다.
API
job(Job)
: JobStep 내에서 실행 될 Job 설정, JobStepBuilder를 반환한다.launcher(JobLauncher)
: Job을 실행할 JobLauncher를 설정한다.parametersExtractor(JobParameterExtractor)
: Step의 ExecutionContext를 Job이 실행되는데 피룡한 JobParameters로 변환한다.build()
: JobStep을 생성한다.
반응형
'Java & Kotlin > Spring Batch' 카테고리의 다른 글
[SpringBatch] 멀티쓰레드 Step (0) | 2022.07.02 |
---|---|
[Spring Batch] @JobScope와 @StepScope (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 실행 - Flow (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 실행 - Job (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 도메인 - Step, 나머지 (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 도메인 - Job (0) | 2022.05.28 |