Spring Boot @SchedulerLock는 분산 잠금 기능을 제공하는 어노테이션입니다. 분산 시스템에서 여러 인스턴스가 동시에 실행되고 있는 경우, 특정 작업을 한 번에 한 인스턴스 만 실행하도록 보장합니다. 즉 서버가 여러곳에서 구동중일 때 스케줄락을 통해 스케줄러가 한번만 실행되도록 해주는 기능입니다.
사용법
- build.gradle에 dependency 주입
//shedlock
implementation("net.javacrumbs.shedlock:shedlock-spring:4.14.0")
implementation("net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.14.0")
- Config클래스 생성
@Configuration
class SchedulerConfiguration {
@Bean fun lockProvider(dataSource: DataSource): LockProvider {
return JdbcTemplateLockProvider(dataSource)
}
}
- DB 테이블 생성
CREATE TABLE shedlock (
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
- @SchedulerLock을 사용할 메서드에 추가합니다.
@Scheduled(cron = "0 14/15 * * * ?")
@SchedulerLock(name = "FcmScheduler_scheduledTask1", lockAtLeastFor = "PT5M", lockAtMostFor = "PT14M")
public void scheduledTask1() {
// 작업 코드
}
- name: 잠금의 이름을 지정합니다. 모든 서버에서 동일한 이름을 사용해야 합니다.
- 스케줄락을 구분하는 고유한 구분자이며, 중복되는 작업을 방지 해줍니다.
- lockAtLeastFor: 잠금이 유지되는 최소 시간을 지정합니다. ISO 8601 기간 형식을 사용합니다.
- lockAtMostFor: 잠금이 유지되는 최대 시간을 지정합니다. ISO 8601 기간 형식을 사용합니다.
예제
위의 예제에서는 @Scheduled와 함께 @SchedulerLock을 사용하여 스케줄링된 작업을 실행합니다. 이 예제에서는 스케줄링된 작업이 15분마다 실행되며, FcmScheduler_scheduledTask1 로 선언된 잠금이 최소 5분에서 최대 14분 동안 유지됩니다.
'Programing > Spring Boot' 카테고리의 다른 글
| 동시성 문제 해결 - 비관적 락 (Pessimistic Lock) (0) | 2023.08.03 |
|---|---|
| 코틀린 Querydsl Pageble Sort 동적 정렬 쉽게 사용하기 + 유틸화 (0) | 2023.07.13 |
| SpringBoot @RequestBody 데이터 선택적으로 받기 (0) | 2023.07.04 |
| 코틀린 스프링부트 Querydsl 사용 예제 (0) | 2023.07.03 |
| Scanner 테스트코드 작성하기 System.setIn() (0) | 2023.07.02 |