Programing/Spring Boot

스프링부트 스케줄러가 여러번 실행된다면? @SchedulerLock 사용법

딩코딩 2023. 7. 6. 13:19

Spring Boot @SchedulerLock는 분산 잠금 기능을 제공하는 어노테이션입니다. 분산 시스템에서 여러 인스턴스가 동시에 실행되고 있는 경우, 특정 작업을 한 번에 한 인스턴스 만 실행하도록 보장합니다. 즉 서버가 여러곳에서 구동중일 때 스케줄락을 통해 스케줄러가 한번만 실행되도록 해주는 기능입니다.

사용법

  1. build.gradle에 dependency 주입
//shedlock
implementation("net.javacrumbs.shedlock:shedlock-spring:4.14.0")
implementation("net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.14.0")
  1. Config클래스 생성
@Configuration
class SchedulerConfiguration {
    @Bean fun lockProvider(dataSource: DataSource): LockProvider {
        return JdbcTemplateLockProvider(dataSource)
    }
}
  1. DB 테이블 생성
CREATE TABLE shedlock (
  name VARCHAR(64),
  lock_until TIMESTAMP(3) NULL,
  locked_at TIMESTAMP(3) NULL,
  locked_by VARCHAR(255),
  PRIMARY KEY (name)
)
  1. @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분 동안 유지됩니다.