본문 바로가기
스프링

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

by 멋진 개구리 2024. 2. 15.
반응형

업무 진행중에 헤비한 프로시져를 돌리다가 데드락이 걸려 실행이 되지않아 고민을 하게 되었습니다. 
스프링 부트를 사용하여 애플리케이션을 개발할 때, @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 스위치 같은 느낌으로 이해를 하니 쉬웠습니다!

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

 

 

반응형

댓글