잘 정리해보자

Spring Batch 설정과 시작 본문

Spring/Spring Boot

Spring Batch 설정과 시작

토마토오이 2022. 1. 11. 00:07

Spring Boot, Gradle, Spring Batch, lombok 환경에서 시작

 

 

 

main application 파일에서 @EnableBatchProcessing 어노테이션으로 배치 사용을 설정한다.

@EnableBatchProcessing //spring batch 사용 설정
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //DB사용안함
public class BatchprojectApplication {

    public static void main(String[] args) {
        SpringApplication.run(BatchprojectApplication.class, args);
    }

}

 

 

 

 

 

 

배치 테스트를 위한 job 실행 config 파일을 작성

 

 

1. @Configuration 어노테이션으로 config파일임을 표시한다.

 

@Configuration
@RequiredArgsConstructor
@Slf4j
public class TestConfigJob {

    private final JobBuilderFactory jobBuilderFactory; //job관리해주는 팩토리. 이미 bean으로 생성됨.
    private final StepBuilderFactory stepBuilderFactory;

JobBuildFactory와 StepBuildFactory는 각 job과 step 커스텀 생성을 도와주는 bean이다.

이미 bean으로 생성되어 생성자로 선언하면 된다. (생성자 선언하던가, @RequiredArgsConstructor 처리)

 

 

 

 

2. Job 설정

 @Bean
    public Job testJob(){
        return jobBuilderFactory.get(JOBNAME)
                .incrementer(new RunIdIncrementer()) //job실행할떄마다 파라미터 id를 자동생성
                .start(this.step1()) //최초 실행 step
                .build();
    }

@Bean으로 실행할 Job을 설정한다.

(Job은 여러개의 Step을 실행하며, .start()가 처음 실행, .flow().flow()...으로 여러개 step 실행할 수 있다.)

 

 

 

 

3. Step 설정

@Bean
    public Step step1(){
        return stepBuilderFactory.get("step1")
                .tasklet((contribution, chunkContext) -> {
                    log.info("step1 start!");

                    return RepeatStatus.FINISHED;
                })
                .build();
    }

실행할 Step을 Bean으로 생성하고, stepBuildFactory를 통해 step생성을 시작한다.

.tasklet은 step 전체 프로세스를 구성하며, return 으로 tasklet이 끝나는 것을 알려야 한다.

 

 

 

TestConfigJob 소스

@Configuration
@RequiredArgsConstructor
@Slf4j
public class TestConfigJob {

    private final JobBuilderFactory jobBuilderFactory; //job관리해주는 팩토리. 이미 bean으로 생성됨.
    private final StepBuilderFactory stepBuilderFactory;

    private String JOBNAME = "testJob";

    @Bean
    public Job testJob(){
        return jobBuilderFactory.get(JOBNAME)
                .incrementer(new RunIdIncrementer()) //job실행할떄마다 파라미터 id를 자동생성
                .start(this.step1()) //최초 실행 step
                .build();
    }

    @Bean
    public Step step1(){
        return stepBuilderFactory.get("step1")
                .tasklet((contribution, chunkContext) -> {
                    log.info("step1 start!");

                    return RepeatStatus.FINISHED;
                })
                .build();
    }

}

 

 

 

 

 

배치 실행을 해야하는데, 만약 배치 config job이 여러개인 경우, 모두 순서와 상관없이 실행되어 구별하기 힘들기 때문에 설정파일에 job name을 받아 파라미터 처리가 필요하다.

 

우선 JOBNAME인 testJob을 툴에서 그냥 실행해보는 경우

Run config에서 Enviroment > Program arguments 에 아래 파라미터 추가 후 실행.

 

--spring.batch.job.names=testJob

 

 

 

로그에 아래와 같이 log.info 값이 출력된다.

(step1() 의 tasklet 에 입력한 로그)

 

 

 

 

매번 실행때마다 이렇게 할 수는 없으니, application.yml 설정 파일에 선언.

 

spring:
  batch:
    job:
      names: ${job.name:NONE}

--spring.batch.job.names 를 그대로 풀어쓴 설정이다.

${job.name} 파라미터를 받으며, 파라미터가 없는 경우 :NONE 처리에 의해 어떠한 job도 실행하지 않는다.

 

 

yml 설정파일 저장 후 다시 Run config에서 Enviroment > Program arguments 에 아래 파라미터로 변경.

 

--job.name=testJob

 

 

마찬가지로 로그가 출력된다.

 

 

Comments