프레임워크/스프링

[스프링부트] AtomicBoolean 스케줄된 작업을 조건부로 실행하는 방법

멋진 개구리 2024. 2. 15. 16:19
반응형

업무 진행중에 헤비한 프로시져를 돌리다가 데드락이 걸려 실행이 되지않아 고민을 하게 되었습니다. 
스프링 부트를 사용하여 애플리케이션을 개발할 때, @Scheduled 어노테이션을 사용해 정기적으로 실행되는 작업을 쉽게 구성할 수 있습니다. 그러나 때로는 특정 작업이 실행 중일 때 다른 작업을 일시 중지하고 싶을 수 있습니다. 예를 들어, 매일 자정에 데이터베이스 정리 작업을 실행하는 동안, 다른 주기적인 작업을 잠시 멈추고 싶은 경우가 있을 것입니다. 이 글에서는 그러한 시나리오를 처리하는 방법에 대해 알아보겠습니다.

문제 정의

여기 두 가지 스케줄된 작업이 있습니다:

           1. 매일 자정에 실행되는 작업: 데이터베이스를 정리하는 무거운 작업입니다.
           2. 매 30초마다 실행되는 작업: 경량의 데이터 처리 작업입니다.


자정에 실행되는 데이터베이스 정리 작업이 진행되는 동안, 매 30초마다 실행되는 작업을 일시 중지하고 싶습니다.!!!!!!!!!

해결 방법

작업의 실행 상태를 추적하기 위해 AtomicBoolean을 사용합니다. 이 방법은 스레드 안전하며, 작업의 실행 여부를 간단하게 관리할 수 있게 해줍니다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicBoolean;

@Component
public class ScheduledTasks {

    private final AtomicBoolean midnightTaskRunning = new AtomicBoolean(false);

    @Scheduled(cron = "0 0 0 * * *")
    public void midnightTask() {
        midnightTaskRunning.set(true);
        try {
            // 자정 작업 로직
        } finally {
            midnightTaskRunning.set(false);
        }
    }

    @Scheduled(cron = "0/30 * * * * *")
    public void everyThirtySecondsTask() {
        if (midnightTaskRunning.get()) {
            return;
        }
        // 30초마다 실행되는 작업 로직
    }
}

 

위 코드에서 midnightTaskRunning 변수는 자정 작업의 실행 상태를 나타냅니다. 자정 작업이 시작되면 true로 설정되고, 완료되면 false로 다시 설정됩니다. 그리고 매 30초마다 실행되는 작업에서는 이 변수의 상태를 확인하여, 자정 작업이 실행 중일 경우(true일 경우) 해당 작업을 건너뛰고 실행하지 않습니다.


결론

복잡한 로직이 될줄 알았으나 on off 스위치 같은 느낌으로 이해를 하니 쉬웠습니다!

이 방법을 통해 스프링 부트 애플리케이션에서 스케줄된 작업을 보다 유연하게 관리할 수 있습니다. 특히, 자원이 제한된 환경에서 무거운 작업과 경량 작업의 우선 순위를 조절해야 할 때 유용할 것입니다.

 

 

반응형