수업 종료 후 사용한 이용권을 차감하려고 함
booking 정보를 읽어서 이용권 차감 처리를 할 때 process 과정에서 별도의 스레드가 할당되어서 작업을 병렬로 처리하는 방식인 AsyncItemProcessor을 사용하려고 함
process 로직을 병렬로 처리하는 방식
@Bean
public Step usePassesStep(){
return new StepBuilder("usePassesStep",jobRepository)
.<BookingEntity, Future<BookingEntity>>chunk(CHUNK_SIZE,transactionManager)
.reader(usePassesItemReader()) //수업이 종료된 이용권을 읽음
.processor(usePassesAsyncItemProcessor())
.writer(usePassesAsyncItemWriter())
.build();
}
@Bean
public AsyncItemProcessor<BookingEntity,BookingEntity> usePassesAsyncItemProcessor(){
AsyncItemProcessor<BookingEntity,BookingEntity> asyncItemProcessor = new AsyncItemProcessor<>();
asyncItemProcessor.setDelegate(usePassesItemProcessor()); // booking 엔티티 의 이용권 사용 여부를 true 로 변경하고 이용권 남은 개수를 하나 차감
asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); //스레드 새로 생성
return asyncItemProcessor;
}
@Bean
public AsyncItemWriter<BookingEntity> usePassesAsyncItemWriter(){
AsyncItemWriter<BookingEntity> asyncItemWriter = new AsyncItemWriter<>();
asyncItemWriter.setDelegate(usePassesItemWriter());
return asyncItemWriter;
}