Chunk 방식을 적용할 경우 ItemReader, ItemProcessor, ItemWriter를 이용한 배치처리가 가능하다.
이때 ItemProcessor를 다중 적용할 수 있는 방법인 CompositeItemProcessor에 대해 소개하겠다.
CompositeItemProcessor
CompositeItemProcessor 코드를 보면 List<ItemProcessor> delegates 객체를 확인 할 수 있다.
Step 생성 시 CompositeItemProcessor에 작업을 실행하길 원하는 ItemProcessor들을 작업 순서에 따라 List로 구현한 후
delegates에 적용하면 list 순서대로 Processor 작업이 진행된다.
해당 내용을 기반으로 적용해 실행해보도록 하겠다.
A의 값을 1부터 10까지 갖고 있는 JbgroundNumber 객체가 10 개가 있고
AddProcessor 작업에서는 B 값을 랜덤으로 추가
SumProcessor 작업에서는 A와 B 값을 더해 Result에 입력한다.
public class JbgroundNumber {
private int a;
private int b;
private int result;
}
public CompositeItemProcessor<JbgroundNumber, JbgroundNumber> createProcessor() throws Exception {
CompositeItemProcessor<JbgroundNumber, JbgroundNumber> compositeItemProcessor = new CompositeItemProcessor<>();
compositeItemProcessor.setDelegates(Arrays.asList(new AddItemProcessor<>(), new SumItemProcessor<>()));
compositeItemProcessor.afterPropertiesSet();
return compositeItemProcessor;
}
실행결과
Job 설정 예제
@Configuration
@EnableBatchProcessing
public class CompositeJobConfiguration {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public CompositeJobConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job composite() throws Exception {
return jobBuilderFactory.get("composite")
.incrementer(new RunIdIncrementer())
.preventRestart() //중단 시 재시작 방지
.start(compositeStep())
.build();
}
public Step compositeStep() throws Exception {
return stepBuilderFactory.get("composite")
.<JbgroundNumber, JbgroundNumber>chunk(100)
.reader(new JbgroundReader<>())
.processor(createProcessor())
.writer(new JbgroundWriter<>())
.build();
}
public CompositeItemProcessor<JbgroundNumber, JbgroundNumber> createProcessor() throws Exception {
CompositeItemProcessor<JbgroundNumber, JbgroundNumber> compositeItemProcessor = new CompositeItemProcessor<>();
//방법 1
compositeItemProcessor.setDelegates(Arrays.asList(new AddItemProcessor<>(), new SumItemProcessor<>()));
compositeItemProcessor.afterPropertiesSet();
//방법 2
// List<ItemProcessor<JbgroundNumber, JbgroundNumber>> list = new ArrayList<>();
// list.add(new AddItemProcessor<>());
// list.add(new SumItemProcessor<>());
// compositeItemProcessor.setDelegates(list);
// compositeItemProcessor.afterPropertiesSet();
return compositeItemProcessor;
}
}
전체 소스 보기
'Java' 카테고리의 다른 글
[Regex] 정규 표현식 (0) | 2024.05.05 |
---|---|
[Thread] 뮤텍스, 세마포어, 모니터의 스레드 동기화와 구현 예제 (0) | 2023.06.20 |
[Spring Batch]#6 스프링 배치 Item Reader (0) | 2023.01.17 |
[Thymeleaf] 타임리프 유틸 함수 - #strings, #arrays 등등 (0) | 2022.10.05 |
[Spring Batch] #4 스프링 배치 Step 과 Tasklet (0) | 2022.09.27 |