WAS 이중화 구성된 서비스에서 Spring 스케줄러를 이용할 때,
2개 이상의 서버에서 중복실행을 막기위해서 LOCK기능을 이용하여 DB를 공통참조하도록 제공하는 라이브러리가 있다.
바로 ShedLock이다.
활용방법은 아래 순서와 같다.
- 저장할 DB를 선정한다.
- 선정한 저장소에 테이블을 생성한다.
- Maven Dependency를 추가한다.
- Bean을 등록한다.
- 스케줄 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설정)
참조URL:
'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 |