본문으로 바로가기

WAS 이중화 구성된 서비스에서 Spring 스케줄러를 이용할 때,

2개 이상의 서버에서 중복실행을 막기위해서 LOCK기능을 이용하여 DB를 공통참조하도록 제공하는 라이브러리가 있다.

바로 ShedLock이다.

활용방법은 아래 순서와 같다.

  1. 저장할 DB를 선정한다.
  2. 선정한 저장소에 테이블을 생성한다.
  3. Maven Dependency를 추가한다.
  4. Bean을 등록한다.
  5. 스케줄 Class 및 Method에 어노테이션을 추가한다.

 

 

#1. 저장할 DB를 선정한다. 

MySQL 선택

 

#2. 선정한 저장소에 테이블을 생성한다.

MySQL DB

CREATE TABLE shedlock (

    name VARCHAR (64),

    lock_until TIMESTAMP (3) NULL ,

    locked_at TIMESTAMP (3) NULL ,

    locked_by VARCHAR (255),

    PRIMARY KEY (name)

);

 

#3. Maven Dependency를 추가한다.

POM.xml

<!-- 스케줄러 lock -->

<dependency>

   <groupId>net.javacrumbs.shedlock</groupId>

   <artifactId>shedlock-spring</artifactId>

   <version>3.0.0</version>

</dependency>

<!-- JDBC TEMPLATE -->

<dependency>

   <groupId>net.javacrumbs.shedlock</groupId>

   <artifactId>shedlock-provider-jdbc-template</artifactId>

   <version>3.0.0</version>

</dependency>

 

#4. Bean을 등록한다.

ScheduleController

public class ScheduleController {

 

 

    @Bean

    public LockProvider lockProvider(DataSource dataSource) {

        return new JdbcTemplateLockProvider(dataSource);

    }

}

 

#5. 스케줄 Class 및 Method에 어노테이션을 추가한다.

ScheduleController

@EnableScheduling

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

public class ScheduleController {

 

 

    private static final String ONE_MIN = "PT1M"; // 1분동안 Lock

 

 

    @Scheduled(cron="0 30 6 * * *") //매일 오전 6시30분에 수행

    @SchedulerLock(name = "{유니크한 이름 입력}", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN)

    public void getSomething() throws Exception {

        //do something....

    }

 

 

    @Bean

    public LockProvider lockProvider(DataSource dataSource) {

        return new JdbcTemplateLockProvider(dataSource);

    }

}

 

** 5번 Step에서  @EnableSchedulerLock 을 꼭! 추가해줘야한다. 계속 안되서 헤메다가 해결 ㅠㅠ

** Locking Time은 스케줄 수행 주기에보다 1분적게 맞추는 걸 권장한다.(ex. 15분마다 수행되는 배치면, 최소/최대 14분 lock설정)

Locking Time 설정 관련

참조URL: 

https://github.com/lukas-krecan/ShedLock

www.baeldung.com/shedlock-spring

'IT > Java & Jsp & Spring' 카테고리의 다른 글

Spring 스케쥴러 사용  (0) 2019.10.04
HTTP와 HTTPS의 차이점  (0) 2017.12.22
JAVA 개발환경 셋팅하기 with JDK, Eclipse  (0) 2017.11.11
SFTP 파일전송  (0) 2017.11.10