Spring Batch
컴포넌트

Step
-
Job에 대한 순차적인 처리 단계
-
하나의 Job은 여러 Step을 가질 수 있음
|
Chunk-oriented Processing, Chunk 지향 처리
한 번에 하나씩 데이터를 읽어와 Chunk로 만든 뒤 Chunk 단위로 트랜잭션을 다루는 것을 의미한다. (실패할 경우에 Chunk 단뤼로 롤백한다) 즉, Reader와 Processor에서는 1건씩 다뤄지고, Writer에선 Chunk 단위로 처리된다.
|
Tasklet
-
Step에서 실행되는 작업
-
Chunk 지향 처리를 기본으로 제공
-
Tasklet을 별도로 구현하여 사용하는 것이 가능 → 개발자가 Step에서 하고 싶은 내용을 자유롭게 작성 가능
-
Tasklet구현을 통해 작성 가능public class SimpleTasklet implements Tasklet { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { // todo return RepeatStatus.FINISHED; } } -
StepExecutionListener구현을 통해 실행 전/후 작업 가능public class SimpleTasklet implements Tasklet, StepExecutionListener { @Override public void beforeStep(StepExecution stepExecution) { // before } @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { // todo return RepeatStatus.FINISHED; } @Override public ExitStatus afterStep(StepExecution stepExecution) { // after return ExitStatus.COMPLETED; } }
메타 테이블
BATCH_JOB_INSTANCE
배치가 정상적으로 수행되면 인스턴스 정보를 기록한다.
이 때, jobParameter 에 따라 실행되므로 중복된 jobParameter 를 전달받으면 실행되지 않는다.
jobParameter 는 아래와 같이 전달할 수 있다.
java -jar batch.jar --spring.batch.job.name=simpleJob param1=true param2=123
코드내에서 jobParameter 를 아래와 같이 가져올 수 있다.
@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(simpleStep1())
.next(simpleStep2(null)) (3)
.build();
}
@Bean
public Step simpleStep1() {
return stepBuilderFactory.get("simpleStep1")
.tasklet((contribution, context) -> {
log.info("{}", context.getStepContext().getJobParameters()); (1)
})
.build();
}
@Bean
@JobScope
public Step simpleStep2(@Value("#{jobParameters[params1]}") Boolean params1) {
return stepBuilderFactory.get("simpleStep2")
.tasklet((contribution, context) -> {
log.info("{}", params1); (2)
})
.build();
}
}
| 1 | Context에서 jobParameter 가져오기 |
| 2 | spring batch scope 선언으로 파라미터를 통해 jobParameter 가져오기 |
| 3 | 어플리케이션 실행시 jobParameter 의 할당되는 것이 아니므로, null 을 넣어주더라도 job 실행시에 파라미터가 주입된다 |
String Batch에는 @StepScope 와 @jobScope 가 있다. @StepScope 를 String Batch 컴포넌트(Tasklet, ItemReader, ItemWriter, ItemProcessor)에 사용하면 Step의 실행시점에 해당 컴포넌트를 Spring Bean으로 생성한다. 또한, @JobScope 는 Job 실행시점에 Spring Bean을 생성한다.
즉, 빈을 어플리케이션 생성 시점이 아닌 scope가 실행되는 시점에 생성하도록 해준다.
jobParameter 중복 이슈를 우회하는 방법job을 실행할 때 동일한
이를 해결하는 방법으로는 매번
위 이슈는 해결된 것 같다. optional/omitted jobParameters are reloaded from previous jobs ⇒ 값이 변경되는 것은 반영이 되는데, 값을 제거하면 이전 값이 주입된다. |
필요한 bean만 로드하기
@ConditionalOnProperty 어노테이션을 통해서 필요한 빈만 로드하기
@ConditionalOnProperty(name = "job.name", havingValue = SampleJobConfig.JOB_NAME) (1)
| 1 | job.name 은 실행시킬 job 이름을 저장하는 값이다. spring.batch.job.name 을 사용할 수도 있다. |
| 2 | job.name 프로퍼티에 SampleJobConfig.JOB_NAME 이 있을 경우에 해당 컴포넌트를 생성하는 어노테이션이다. |
