업무 진행중에 헤비한 프로시져를 돌리다가 데드락이 걸려 실행이 되지않아 고민을 하게 되었습니다.
스프링 부트를 사용하여 애플리케이션을 개발할 때, @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 스위치 같은 느낌으로 이해를 하니 쉬웠습니다!
이 방법을 통해 스프링 부트 애플리케이션에서 스케줄된 작업을 보다 유연하게 관리할 수 있습니다. 특히, 자원이 제한된 환경에서 무거운 작업과 경량 작업의 우선 순위를 조절해야 할 때 유용할 것입니다.
'프레임워크 > 스프링' 카테고리의 다른 글
[에러]Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath. (4) | 2023.12.22 |
---|---|
[spring] IntelliJ 스프링 #3 Mapper, mybatis 설정. (15) | 2023.10.13 |
[spring] IntelliJ 스프링 #2 DB.연결(mariaDB) (6) | 2023.10.12 |
[spring] IntelliJ 스프링(maven) #1 개발환경 만들기 (6) | 2023.10.11 |
Static Resources 매핑 안 (0) | 2023.06.13 |
댓글