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 |
---|