Spring scheduler은 활성화를 위해 EnableScheduling 어노테이션을 붙여주면 된다.
@EnableScheduling
@SpringBootApplication
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
특징으로는
- method는 void return 타입을 가져야한다
- method는 파라미터를 가질수없다
@Component
@EnableAsync
public class ScheduleTest {
@Scheduled(fixedDelay = 1000) // 작업이 끝난 시점부터 시간 세기
public void scheduleFixedDelayTask() throws InterruptedException {
System.out.println(System.currentTimeMillis() / 1000);
Thread.sleep(5000);
}
@Async
@Scheduled(fixedRate = 1000)// 작업의 시작 시점부터 시간을 센다
public void scheduleFixedRateTask() throws InterruptedException {
System.out.println("Fixed rate task - {}"+ System.currentTimeMillis() / 1000);
}
@Scheduled(fixedDelay = 1000, initialDelay = 5000) //initialDelay은 작업이 수행되기전 최초에 쉬게 될 시간 지정
public void scheduleFixedRateWithInitialDelayTask() {
long now = System.currentTimeMillis() / 1000;
System.out.println("Fixed rate task with one second initial delay -{}" + now);
}
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println("schedule tasks using cron jobs - {}" + now);
}
}
위에는 Schedule 사용 예시
단점은 싱글 스레드 이므로 여러개의 작업이 스케쥴이 잡혀있으면 설정된 수행 시간대로 작업이 실행 되지 않을 것이다.
해결 방안은 멀티 스레드로 변경해 주는 것 (다시 따로 정리 해두기)
Spring batch은
Gradle 기준으로 dependency에 implementation 'org.springframework.boot:spring-boot-starter-batch' 를 추가해주면 된다.
EnableBatchProcessing 어노테이션으로 활성화를 시켜주면 된다.
@Configuration
@EnableBatchProcessing
public class SimpleBatchPrac {
private final JobBuilderFactory jobBuilgerFactory;
private final StepBuilderFactory stepBuilderFactory;
public SimpleBatchPrac(JobBuilderFactory jobBuilgerFactory, StepBuilderFactory stepBuilderFactory) {
super();
this.jobBuilgerFactory = jobBuilgerFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job simpleJob() {
return jobBuilgerFactory
.get("simple-job")
.start(simpleStep())
.build();
}
@Bean
public Step simpleStep() {
return this.stepBuilderFactory
.get("simple-step")
.tasklet(simpleTasklet())
.build();
}
@Bean
public Tasklet simpleTasklet() {
return (stepContribution, chunkContext) -> {
for(int i = 10; i>0; i--) {
TimeUnit.SECONDS.sleep(100);
System.out.println(i);
}
return RepeatStatus.FINISHED;
};
}
}
Spring batch는 Chunk 방식과 Tasklet 방식이 있다
Chunk방식은 커밋 사이에 처리되는 row 수 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다룬다.
트랜잭션이기때문에 실패할 경우엔 해당 Chunk 만큼만 롤백 한다.
Tasklet 방식은 spring batch에서 Job(배치 작업) 이 있고 Job은 여러개의 step으로 구성된다.
또 step은 tasklet으로 구성된다.
그렇기 때문에 데이터 처리과정이 Tasklet안에서 한번에 이뤄진다.
spring quartz은 설정 옵션이 있다. → 복잡하지만 대신 다양한 기능을 쓸 수 있다.
- 필수요소는 Job, JobDetail, Trigger 이다.

- scheduler간의 클러스터링 기능, 실패했을때 후처리 기능
클러스터링 이란 여러대의 서버를 병렬로 연결한 상태(하나의 가상 컴퓨터처럼 업무를 수행)
장점은 하나의 서버에서 문제가 생겼을때 로드 발란서에서 제거해 서비스에서 영향을 주지 않는다.
세션 클러스터링은 허용가능을 초과했을때 다른 WAS로 유도 하지만 세션은 하나로 관리되어 불일치가 발생하지 않음.
- 새로들어가는 프로젝트에서 스프링 배치를 알아야만 하는 일이 있어서 공부하기 시작했는데
아직까지는 어려운것같다 더 공부하고 정리해봐야겠다.
'스프링(Spring)' 카테고리의 다른 글
STS가 열리지 않을때 (0) | 2023.08.10 |
---|---|
STS 에 svn 연동하기(안될때 수동설치) (0) | 2023.08.10 |
[SpringMVC] API 계층(Controller) (0) | 2022.12.22 |