본문 바로가기
IT/Spring

2021-04-09-batch

by 봉즙 2023. 2. 28.

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

댓글