728x90
반응형
꽤 스케일이 큰 프로젝트를 하다보면 서버를 여러개 열게 된다.
알림을 보내거나 이메일을 보내는 작업 등과 같이
여러개의 서버를 통해 같은 이벤트를 수행하려다 이를 중복 수행하게 되는 경우가 있다.
이런 경우를 방지하기 위해 스프링에서는 @SchedulerLock 어노테이션을 지원해준다.
https://github.com/lukas-krecan/ShedLock
GitHub - lukas-krecan/ShedLock: Distributed lock for your scheduled tasks
Distributed lock for your scheduled tasks. Contribute to lukas-krecan/ShedLock development by creating an account on GitHub.
github.com
https://www.baeldung.com/shedlock-spring
1. Dedpendency 추가
implementation 'net.javacrumbs.shedlock:shedlock-spring:5.6.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:5.6.0'
2. ShedLock 테이블 생성
CREATE TABLE shedlock (
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
3. Configuration을 통해 Bean 주입
@Configuration
public class SchedulerConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
}
4. ScheduledLock 설정
@Scheduled(cron = "0 0/10 17-01 * * *")
@SchedulerLock(
name = "scheduledLockTest1",
lockAtLeastFor = "PT30S",
lockAtMostFor = "PT30S")
public void scheduledTest() {
//코드
}
name : SchedulerLock을 구분하기 위해 이름을 설정한다.
lockAtLeastFor : 잠금을 유지하는 최소 시간을 설정해준다. PT30S는 30초, PT30M은 30분을 의미한다.
lockAtMostFor : 해당 스케줄러 노드에 문제가 생겨 다운되었을 때 얼마나 lock을 할지에 대한 최대 시간이다.
lockAtMostFor 가 lockAtLeastFor 보다 더 작다면 에러가 발생한다.
728x90
반응형
'개념 정리 > Spring' 카테고리의 다른 글
[Spring] JUnit5에서 예외테스트 하기 (0) | 2023.07.29 |
---|---|
[Spring] @Scheduled 이용해 특정 시간마다 함수 호출하기 (0) | 2023.07.24 |
[Spring Security] 기본 로그인 화면 제거 (0) | 2023.07.23 |
[Spring] UUID와 increment PK를 언제 사용할까? (0) | 2023.07.19 |
[Spring] 스프링 DTO (0) | 2023.07.03 |