티스토리 뷰

728x90

스케쥴러를 사용하는 서비스가 있는데, 서버 이중화를 하게 되면서 스케쥴러를 둘 다 돌리게 되면, 동시에 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 

 

The @Scheduled Annotation in Spring | Baeldung

How to use the @Scheduled annotation in Spring, to run tasks after a fixed delay, at a fixed rate or according to a cron expression.

www.baeldung.com

 

10. Setting Delay or Rate Dynamically at Runtime 참고하여 설정한 내 소스는 아래와 같다. 

 

1️⃣ 기존의 Application에 설정한 @EnableScheduling 어노테이션을 삭제하고, SchedulingConfigurer 인터페이스를 구현하여 config 파일을 별도로 만든다. 

2️⃣ override 한 configureTasks에 스케쥴러를 등록한다. 나는 addCronTask(Runnable task, String expression)을 사용했다. 

 

➡️ 사용 할 수 있는 메서드 확인

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/config/ScheduledTaskRegistrar.html

 

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 * * *");
        }
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함