하나의 Chunk를 하나의 스레드가 담당하는 방식으로 하나의 스레드에서 데이터를 읽고, 가공하고, 쓰는 과정을 처리함

@Bean
public TaskExecutor taskExecutor(){
return new SimpleAsyncTaskExecutor("taskexecutor");
}
@Bean
public Step sampleStep(TaskExecutor taskExecutor) {
return new StepBuiler("Step1",jobRepository)
.<String, String>chunk(10)
.reader(itemReader())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.throttleLimit(20)
.build();
}
process 로직을 병렬로 처리하는 방식

@Bean
public AsyncItemProcessor processor() {
AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor();
asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); // 스레드풀 지정
asyncItemProcessor.setDelegate(itemProcessor());
return asyncItemProcessor;
}
@Bean
public AsyncItemWriter writer() {
AsyncItemWriter asyncItemWriter = new AsyncItemWriter();
asyncItemWriter.setDelegate(itemWriter());
return asyncItemWriter;
}
AsyncItemProcessor는 ItemProcessor를 래핑하는 데코레이터. 실질적인 Process 작업은 새로운 스레드가 ItemProcessor를 실행하고 AsyncItemProcessor 디스패처의 책임을 지니고 AsyncItemProcessor는 Future 타입을 반환함
AsyncItemWriter도 ItemWriter의 데코레이터. AsyncItemProcessor에서 전달된 Future 결과 값을 ItemProcessor에게 위임함
여러 Step을 가질 수 있는 Flow를 병렬로 처리하는 방식

@Bean
public Job makeStatisticsJob(){
Flow addStatisticsFlow = new FlowBuilder<Flow>("addStatisticsFlow")
.start(addStatisticsStep())
.build();
Flow makeDailyStatisticsFlow = new FlowBuilder<Flow>("makeDailyStatisticsFlow")
.start(makeDailyStatisticsStep())
.build();
Flow makeWeeklyStatisticsFlow = new FlowBuilder<Flow>("makeWeeklyStatisticsFlow")
.start(makeWeeklyStatisticsStep())
.build();
Flow parallelStatisticsFlow = new FlowBuilder<Flow>("parallelStatisticsFlow")
.split(new SimpleAsyncTaskExecutor())
.add(makeDailyStatisticsFlow,makeWeeklyStatisticsFlow)
.build();
return new JobBuilder("makeStatisticsJob",jobRepository)
.start(addStatisticsFlow)
.next(parallelStatisticsFlow)
.build()
.build();
}