- Tasklet -

1) Tasklet?

public interface Tasklet {
	@Nullable
	RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}
return stepBuilderFactory.get("sampleStep")
				.transactionManager(transactionManager)
				.tasklet(sampleTasklet)
				.build();

2) Tasklet의 상태

/**
 * 무한히 종료되지 않는 Tasklet이다.
 * 아래와 같이 구현하면 안된다.
 **/
@Bean
@StepScope
public Tasklet sampleTasklet() {
	return (contribution, chunkContext) -> {
		log.info("never ending tasklet");
		return RepeatStatus.CONTINUABLE;
	};
}

/**
 * inish를 log에 찍고 종료하는 Tasklet이다.
 **/
@Bean
@StepScope
public Tasklet sampleTasklet() {
	return (contribution, chunkContext) -> {
		log.info("finish");
		return RepeatStatus.FINISHED;
	};
}

3) Tasklet을 만들 때 주의할점

@Bean
@StepScope
public Tasklet hugeReadTasklet(
			PriceRepository priceRepository
) {
	return (contribution, chunkContext) -> {
		// findByDate로 조회된 데이터가 1천만개 입니다.
		List<Price> prices = priceRepository.findByDate(LocalDate.now());
		// price를 모두 0으로 초기화합니다.
		prices.forEach(price -> price.setAmount(0L));
		// 1천만개의 데이터를 저장합니다.
		priceRepository.saveAll(prices);
		return RepeatStatus.FINISHED;
	};
}
  1. priceRepository.findByDate를 통해서 얼마나 많은 데이터를 가져올지 예측이 불가. 데이터가 너무 많다면 천만개의 데이터를 조회할 수도 있습니다. 천만개의 데이터를 한번에 가져온다면 메모 리 이슈로 인해 처리가 불가해지고 OOM(Out Of Memory)이 발생할 수 도 있습니다.