Spring Batch
를 도입하였습니다.이번 프로젝트에서는 Tasklet으로 구현하였으므로, Taskelt 기준으로 설명하겠습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch' # batch
}
batch:
jdbc:
initialize-schema: ALWAYS #batch 스키마 자동 생성
job:
enabled: false #시작과 동시에 실해되는건 방지
FitchallengeApplication.java
@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling #스케줄링 활성화
@EnableBatchProcessing #배치기능 활성화
public class FitChallengeApplication{
public static void main (String[]args){
SpringApplication.run(FitChallengeApplication.class, args);
}
}
@Configuration
@RequiredArgsConstructor
public class BatchConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final NotificationTasklet notificationTasklet;
//Batch Job 생성
@Bean
public Job notificationJob() {
return jobBuilderFactory.get("notificationJob")
.start(notificationStep())
.build();
}
//Batch Step 생성
@Bean
@JobScope //Job 실행시점에 Bean이 생성됨
public Step notificationStep() {
return stepBuilderFactory.get("notificationStep")
.tasklet(notificationTasklet)
.build();
}
}
Tasklet
interface를 구현하여 execute
메서드를 구현하여 실행할 내용을 넣어주면 된다.@RequiredArgsConstructor
@Component
@StepScope // Step 시점에 Bean이 생성
@Slf4j
public class NotificationTasklet implements Tasklet {
private final QueryNotificationRepository notificationRepository;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext){
log.info(contribution.toString());
log.info(chunkContext.toString());
log.info(">>>>> Delete Notification");
//읽음 상태인 알림 일괄삭제
notificationRepository.deleteNotificationIsRead();
//생성일로부터 3일이 지난 알림 일괄삭제
notificationRepository.deleteNotificationIsNotRead();
return RepeatStatus.FINISHED;
}
}
@Slf4j
@Component
@RequiredArgsConstructor
public class JobScheduler {
private final JobLauncher jobLauncher;
private final BatchConfig batchConfig;
@Scheduled(cron="0 0 12 * * *")
public void runJob(){
Map<String, JobParameter> confMap = new HashMap<>();
confMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(confMap);
try {
jobLauncher.run(batchConfig.notificationJob(), jobParameters);
} catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) {
log.error(e.getMessage());
}
}
}
jobLauncher.run()
메서드는 첫번째 파라미터로 Job
, 두번째 파라미터로 Job Parameter
를 받고있습니다.Job Parameter
의 역할은 반복해서 실행되는 Job
의 유일한 ID
입니다.