layout : post
title : "Spring Batch"
category : Spring
schema-mysql.sql
통해서 테이블 생성한뒤
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-batch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
라이브러리 추가한다
메인 어플리케이션에 어노테이션 추가해준 후
@EnableScheduling
@EnableBatchProcessing
@SpringBootApplication
public class SchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerApplication.class, args);
}
}
작동 로직
@Slf4j
@Configuration
public class SampleJobConfig {
private final SampleRepository sampleRepository;
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public SampleJobConfig(SampleRepository sampleRepository,
JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory) {
this.SampleRepository = sampleRepository;
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Value("${chunkSize:1000}")
private int getChunkSize;
@Bean
public Job sampleJob() {
return jobBuilderFactory.get("SampleJob")
.start(sendStep())
.build();
}
@Bean
@JobScope
public Step sampleStep() {
return stepBuilderFactory.get("SampleStep")
.<SampleDto, SampleDto>chunk(getChunkSize)
.reader(sampleReader())
.writer(sampleWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<SampleDto> sampleReader() {
final List<SampleDto> sampleList = this.sampleRepository.findAll();
return new ListItemReader<>(sampleList);
}
@Bean
@StepScope
public ItemWriter<SampleDto> sampleWriter() {
return this::write;
}
private void write(List<? extends SampleDto> list) {
for (SampleDto sampleDto : list) {
sampleDto.change();
this.storeSmsRepository.save(sampleDto);
}
}
}
스케쥴러 로직
@Slf4j
@Component
public class JobScheduler {
private final JobLauncher jobLauncher;
private final SampleJobConfig sampleJobConfig;
public JobScheduler(JobLauncher jobLauncher,
SampleJobConfig sampleJobConfig) {
this.jobLauncher = jobLauncher;
this.sampleJobConfig = sampleJobConfig;
}
@Scheduled(cron = "0 0 7 * * *", zone = "Asia/Seoul")
public void runSampleJob() {
schedulerRun(sampleJobConfig.sampleJob());
}
private void schedulerRun(Job job) {
Map<String, JobParameter> stringJobParameterMap = new HashMap<>();
stringJobParameterMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(stringJobParameterMap);
try {
jobLauncher.run(job, jobParameters);
} catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) {
log.error(e.getMessage());
}
}
}
'IT > Spring' 카테고리의 다른 글
2021-04-21-JPA-Projection (0) | 2023.02.28 |
---|---|
2021-04-09-static-properties (0) | 2023.02.28 |
2021-04-05-deep-copy (0) | 2023.02.28 |
2021-01-26-remote-debug (0) | 2023.02.28 |
2021-01-12-log4j2 (0) | 2023.02.28 |
댓글