프로젝트를 진행하다보면 일정시간마다 작동해야하는 서비스가 존재할 수 있다.
처음에는 어떻게 구현해야할지 몰라서
스레드를 통해서 구현할까 생각도 했었는데 스레드를 사용하게되면 스레드에서 원하는 시간조건을 sleep 통해 걸어줘야하고 조건을 걸기가 좀 귀찮은 측면이 존재한다.
하지만 스프링에서 지원하는 scheduler를 사용하면 간편하게 구현할 수 있다.
시간조건 또한 Cron 표현식을 통해서 어렵지 않게 작성할 수 있다.
이를 사용하기위해선 servlet.xml 설정을 해야하는데 이는 생략한다.
클래스파일을 등록하는 것은 간단하다. 클래스에 @Component 어노테이션을 달아주고
메소드 앞에 스케쥴 어노테이션을 작성해주면된다.
@Component
public class Scheduler {
/**
* 1. 매월 1일 새벽 2시에 자동으로 결재완료하는 스케쥴러
*/
// * 을 입력할경우 모두(항상)으로 설정함.
// 초 분 시 일 월 요일
@Scheduled(cron = "0 14 14 * * *")
public void autoUpdate(){
System.out.println("오후 02:14:00에 호출이 됩니다 ");
}
}
- Cron 표현식
기본적인 표현식의 의미는 다음과 같다.
초 | 분 | 시 | 일 | 월 | 요일 | 연도
0~59 | 0~59 | 0~23 | 1~31 | 1~12 | 0~6 | 생략가능
필드명 | 값의 허용 범위 | 허용된 특수문자 |
초 (Seconds) | 0 ~ 59 | , - * / |
분 (Minutes) | 0 ~ 59 | , - * / |
시 (Hours) | 0 ~ 23 | , - * / |
일 (Day) | 1 ~ 31 | , - * ? / L W |
월 (Month) | 1 ~ 12 or JAN ~ DEC | , - * / |
요일 (Week) | 0 ~ 6 or SUN ~ SAT | , - * ? / L # |
연도 (Year) | empty or 1970 ~ 2099 | , - * / |
● Cron 표현식 - 특수문자
각 특수문자의 의미● * : 모든 값
● ? : 특정한 값이 없음
● - : 범위 (예) 월요일에서 수요일까지는 MON-WED로 표현
● , : 특별한 값일 때만 동작 (예) 월,수,금 MON,WED,FRI
● / : 시작시간 / 단위 (예) 0분부터 매 5분 0/5
● L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)
● W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음
● # : 몇째주의 무슨 요일을 표현 (예) 3#2 : 2번째주 수요일
크론식은 유닉스 계열 운영체제의 작업 스케쥴러인데 이를 Java에서도 사용할 수 있도록 스프링프레임워크에서
라이브러리를 포함하고 있는 것이다.
그렇기 때문에 원래 크론표현식에서 지원하는 표현식 몇몇 지원하지 않는 표현식이 있다.
그중 하나가 일과 요일에 사용할 수 있는 특수문자에 L 이다.
L은 마지막 일, 요일을 의미하는 특수문자인데 이를 스프링 스케쥴러 라이브러리에서는 지원하고 있지 않고 있다.
따라서 매년 매년 12월 말일 23시 59분 59초 실행에 실행해야하는 서비스가 있다면
@Scheduled(cron = "59 59 23 L 12 ?") 이 아니라 @Scheduled(cron = "59 59 23 28-31 12 ?") 이렇게 작성해준다.
'Java' 카테고리의 다른 글
Java - properties 파일이란 무엇인가? (0) | 2022.06.17 |
---|---|
Java - String 자료형과 StringBuffer (0) | 2022.04.19 |
Java - 현재날짜 구하기 (jdk 1.8 이상) (0) | 2022.01.19 |
try-with-resource 문 : Java - Try() catch : try뒤에 괄호는 뭘까? (0) | 2022.01.18 |
DTO 클래스에서 toString() 메소드를 작성해주는 이유 (0) | 2022.01.10 |