티스토리 뷰
스케쥴러를 사용하는 서비스가 있는데, 서버 이중화를 하게 되면서 스케쥴러를 둘 다 돌리게 되면, 동시에 DB에 접근하기 때문에, 오류가 발생 할 수도 있다. 그렇다고 같은 소스를 배포하면서 스케쥴러 때문에 빌드를 두번해야하는 건 비효율적이다.
그래서 아이피에 따라, 스케쥴러를 실행시킬지 말지 결정하는 방법을 생각했다.
맨 처음에는 일반적인 스케쥴러 사용방식 처럼 사용하되 스케쥴러 내에서 조건문을 사용하려고 했다.
24.03.14++
이런식으로 스케쥴러를 특정 서버에서는 안 돌게 지정하면 안된다..! 스케쥴러가 돌아가는 서버가 죽으면 어떡해..! 🥹
1년도 안된 신입 때 생각한 방법이라..위와 같은 이유라면 따라하지마세요..
만약 스케쥴러가 동시에 돌아 동시 DB 접근이 우려된다면 shedlock을 사용하면 된다!
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
String ip = 127.0.0.0;
if (InetAddress.getLocalHost().getHostAddress().equals(ip)) {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
}
그러나 위의 코드의 문제는...if문을 실행만 시키지 않을 뿐...어쨋든 스케쥴러는 돈다는 것이다. @Scheduled 어노테이션은 spring context가 초기화 될 때 한번 실행되기 때문에, 그러면 초기화 될 때 어떤 설정을 해주면 되지 않을까..라는 고민에 구글링을 했다.
그리고 아래 페이지 10. Setting Delay or Rate Dynamically at Runtime 에서 답을 찾을 수 있었다.
https://www.baeldung.com/spring-scheduled-tasks
10. Setting Delay or Rate Dynamically at Runtime 참고하여 설정한 내 소스는 아래와 같다.
1️⃣ 기존의 Application에 설정한 @EnableScheduling 어노테이션을 삭제하고, SchedulingConfigurer 인터페이스를 구현하여 config 파일을 별도로 만든다.
2️⃣ override 한 configureTasks에 스케쥴러를 등록한다. 나는 addCronTask(Runnable task, String expression)을 사용했다.
➡️ 사용 할 수 있는 메서드 확인
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.net.InetAddress;
@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {
@Autowired
private 서비스 서비스;
@Value("${ip}") //application.property에 설정한 값
String ip;
@SneakyThrows
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
if (InetAddress.getLocalHost().getHostAddress().equals(ip)) {
taskRegistrar.addCronTask(new Runnable() {
@Override
public void run() {
서비스.메서드(); //실행시킬 메서드
}
}, "0 0 0/1 * * *");
}
}
}
'백엔드 > spring' 카테고리의 다른 글
전자정부프레임워크에서 다중디비 연결하기(mariaDB, oracle) (0) | 2022.05.02 |
---|---|
전자정부프레임워크 스케쥴러 설정 (0) | 2022.04.28 |
[springboot+react+jwt] jwt 인증 후 react에서 headers에 인증값이 없는 경우 해결 방법 (0) | 2022.04.11 |
JSP에서 properties 값 사용하기 (0) | 2022.03.28 |
@Controller 와 @RestController의 차이 (0) | 2022.03.24 |
- Total
- Today
- Yesterday
- 톰캣
- Spring
- java
- Docker
- 쿠버네티스
- 도커
- mysql
- springboot
- 아파치카프카
- Linux
- 스프링
- javascript
- 코딩테스트
- 전자정부프레임워크
- 코테
- 현대오토에버
- 오토에버코테
- centos
- Kubernetes
- java 코테
- softeer java
- react
- softeer
- 현대
- 자바
- tomcat
- 리액트
- 자바스크립트
- 현대코테
- 자바코테
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |