[Batch] Job,step 실행하기

 

1. 일단 기본적으로 프로젝트를 생성하게 되면 배치를 실행한다는 어노테이션을 적용을 시켜줘야한다.

     (@EnableBatchProccsing)

@EnableBatchProcessing
@SpringBootApplication
@EnableBatchProcessing // 스프링 배치 작동하기 위해 선언하는 어노테이션
public class BatchApplication {
    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class, args);
    }

}

 

2. 그리고 새로운 Class 파일을 아무 이름으로 하나 새로 생성한다.

@Configuration
@RequiredArgsConstructor
public class JobConfiguration {

    // 의존성 주입
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

생성하게 되면 Confiruration 어노테이션을 사용해서 class 를사용한다고 인식 시켜주고

@RequiredArgsConstructor

를 사용하게 되면 @AutoWide 대신에 생성자변수에 final 만 붙혀주면 의존성 주입이 완료된다.

 

 

 

3. 일단 시작하는 로직은 Job  실행하게 되면 Job 이 포함하고 있는 Step 들을 1개이면 1개

     여러개이면 여러개를 순차적으로 호출 시킨다.

@Bean //빈등록
public Job Job() {
    return jobBuilderFactory.get("Job")
            .start(JobStep1())
            .next(JobStep2())
            .build();
}

4. 일단 저는 JobStep1번이 실행되고 JobStep2 번이 실행되도록 만들었다.

    기본적으로 tasklet 을 사용하게 되면 무한으로 반복 되지만 

     excute 를 오버라이드 해서 return 값을 null or RepeatStatus.FINISHED 를 사용하게 되면

     로직이 1번돌고 끝난다.

 

@Bean
public Step JobStep1() {
    return stepBuilderFactory.get("JobStep1")
            // 기본적으로 tasklet 은 반복적으로 계속돈다.
            .tasklet(new Tasklet() {
                
                // null 이면 1번실행하고 종료됨
                @Override
                public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

                    System.out.println("====================");
                    System.out.println(">> JobStep1 번이 실행");
                    System.out.println("====================");
                    
                    return RepeatStatus.FINISHED; // 한번하고 종료하는것
                }
            })
            .build();
}

@Bean
public Step JobStep2() {
    return stepBuilderFactory.get("JobStep2")
            // 기본적으로 tasklet 은 반복적으로 계속돈다.
            .tasklet(new Tasklet() {

                // null 이면 1번실행하고 종료됨
                @Override
                public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

                    System.out.println("====================");
                    System.out.println(">> JobStep2 번이 실행");
                    System.out.println("====================");

                    return RepeatStatus.FINISHED; // 한번하고 종료하는것
                }
            })
            .build();
}

 

5. 아래는 실행하고나서의 실행 결과 콘솔 창이다.

 

 

6. 완성본 코드

 

package com.www.batch;

import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@RequiredArgsConstructor
public class JobConfiguration {

    // 의존성 주입
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


    @Bean //빈등록
    public Job Job() {
        return jobBuilderFactory.get("Job")
                .start(JobStep1())
                .next(JobStep2())
                .build();
    }

    @Bean
    public Step JobStep1() {
        return stepBuilderFactory.get("JobStep1")
                // 기본적으로 tasklet 은 반복적으로 계속돈다.
                .tasklet(new Tasklet() {
                    
                    // null 이면 1번실행하고 종료됨
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

                        System.out.println("====================");
                        System.out.println(">> JobStep1 번이 실행");
                        System.out.println("====================");
                        
                        return RepeatStatus.FINISHED; // 한번하고 종료하는것
                    }
                })
                .build();
    }

    @Bean
    public Step JobStep2() {
        return stepBuilderFactory.get("JobStep2")
                // 기본적으로 tasklet 은 반복적으로 계속돈다.
                .tasklet(new Tasklet() {

                    // null 이면 1번실행하고 종료됨
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

                        System.out.println("====================");
                        System.out.println(">> JobStep2 번이 실행");
                        System.out.println("====================");

                        return RepeatStatus.FINISHED; // 한번하고 종료하는것
                    }
                })
                .build();
    }

}

 

'🎫 Batch' 카테고리의 다른 글

[Batch] DB schema 설정 (application)  (0) 2023.08.22