본문 바로가기
JAVA

[BASE] CRON Scheduler

by F.E.D 2018. 5. 31.

CRON Scheduler

1. Cron?

CRON은 유닉스 도구로서 오랫동안 사용되어 왔으며, 따라서 그 스케쥴링 기능은 강력하다고 인정받고 있습니다. CronTrigger 클래스는 cron의 스케줄링 기능을 기반으로합니다. 
CronTrigger는 "cron expression"을 사용하여 "매주 월요일부터 금요일까지 오전 8시" 또는 "매월 마지막 금요일부터 오전 1시 30 분" 과 같은 실행 일정을 만들 수 있습니다. 


2. Format

cron 표현식은 공백으로 구분 된 6 또는 7 개의 필드로 구성된 문자열입니다. 필드에는 해당 필드에 대해 허용되는 특수 문자의 다양한 조합과 함께 허용 된 값이 포함될 수 있습니다. 
필드는 다음과 같습니다.

시간

필수

범위

허용 특수 문자

Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L #
Year NO empty, 1970-2099 , - * /

따라서 cron 표현식은 다음과 같이 간단히 표현할 수 있습니다

* * * * ? * 

3. 허용 특수 문자

* ( "모든 값") : 필드 내의 모든 값을 선택하는 데 사용됩니다. 예를 들어 * "매분"을 의미합니다.


? ( "특정 값 없음") : 문자가 허용되는 두 필드 중 하나에서 무언가를 지정해야하지만 다른 필드에서는 무언가를 지정해야하는 경우에 유용합니다. 


예를 들어, 특정 날짜 (예 : 10일)에 트리거가 실행되기를 원하지만 그 요일이 어떤 요일인지 신경 쓰지 않으면 당일에 "10"을 넣을 것입니다 


- : 범위를 지정하는 데 사용됩니다. 예를 들어 시간 필드의 "10-12"은 "10, 11 및 12 시"를 의미합니다.


, : 추가 값을 지정하는 데 사용됩니다. 예를 들어, 요일 필드의 "MON, WED, FRI"는 "월요일, 수요일 및 금요일"을 의미합니다.


/ : 증분을 지정하는 데 사용됩니다.
예를 들어 초 필드의 "0/15"는 "0, 15, 30 및 45초"를 의미합니다.
초 필드의 "5/15"는 "5, 20, 35, 50 초"를 의미합니다. 
day-of-month 필드의 '1/3'은 '해당 달의 첫날부터 3 일마다'를 의미합니다.


L ( "last") : 허용되는 두 필드 각각에서 다른 의미를가집니다. 

예를 들어, 월 필드의 값 "L"은 "월 마지막 날"을 의미합니다. 
1월 31일, 비 윤년의 2월 28일 입니다.

요일 필드에서 단독으로 사용하면 "7"또는 "SAT"를 의미합니다.
그러나 다른 값 다음에 요일 필드에서 사용되는 경우 "월의 마지막 xxx 일"을 의미합니다.
예를 들어 "6L"은 "해당 월의 마지막 금요일"을 의미합니다. 
또한 "L-3"과 같이 해당 월의 마지막 날의 오프셋을 지정할 수도 있습니다.
이 오프셋은 해당 월의 세 번째에서 마지막 날을 의미합니다. 
'L'옵션을 사용하는 경우 혼란 스럽거나 예기치 않은 결과를 얻으므로 목록 또는 값 범위를 지정하지 않는 것이 중요합니다.


W ( "weekday") :  주어진 요일에 가장 가까운 요일 (월 - 금)을 지정하는 데 사용됩니다. 
예를 들어, "15W"를 day-of-month 필드의 값으로 지정하면 의미는 "매월 15일에 가장 가까운 요일"입니다. 
15일이 토요일이면 14일 금요일에 이벤트가 발생합니다.
15 일이 일요일이면 16일 월요일에 이벤트가 발생합니다.
그러나 15일이 화요일이면 15일 화요일에 이벤트가 발생합니다.
달력을 기준으로 생각하면 되겠죠?

그러나 "1W"를 요일 값으로 지정하고 첫 번째 요일을 토요일로 지정하면 3일 월요일에 이벤트가 발생합니다. 'W'문자는 요일이 범위 또는 요일 목록이 아닌 하루일 경우에만 지정할 수 있습니다.

# : "n 번째" XXX 요일을 지정하는 데 사용됩니다. 
예를 들어, 요일 필드의 "6#3"값은 "매월 세 번째 금요일"(6일 = 금요일)을 의미합니다.

(ex)
"2 # 1"= 매월 첫째 월요일.
"4 # 5"= 매월 다섯 번째 수요일.

"# 5"를 지정하고 그 달에 주어진 요일 중 5개가없는 경우 그 달에 아무 이벤트도 일어나지 않습니다.


4. Full Example


형식 해설
0 0 12 * * ? 매일 정오(12pm)
0 15 10 ? * * 매일 10:15am
0 15 10 * * ? 매일 10:15am
0 15 10 * * ? * 매일 10:15am
0 15 10 * * ? 2005 2005년도 매일 10:15am
0 * 14 * * ? 매일 2pm 시작해서 2:59pm까지 매분
0 0/5 14 * * ? 매일 2pm 시작해서 2:55pm까지 매 5분
0 0/5 14,18 * * ? 매일 2pm 시작해서 2:55pm까지 매 5분, 매일 6pm 시작해서 6:55pm까지 매 5분
0 0-5 14 * * ? 매일 2pm 시작해서 2:05pm까지
0 10,44 14 ? 3 WED 3월 매 수요일 2:10pm, 2:44pm 마다
0 15 10 ? * MON-FRI 매 월요일, 화요일, 수요일, 목요일, 금요일 10:15am 마다
0 15 10 15 * ? 매월 15일 10:15am 마다
0 15 10 L * ? 매월 마지막 날 10:15am 마다
0 15 10 L-2 * ? 매월 마지막에서 2번째 날 10:15am 마다
0 15 10 ? * 6L 매월 마지막 금요일 10:15am 마다
0 15 10 ? * 6L 2002-2005 2002, 2003, 2004, 2005년도 매달 마지막 금요일 10:15am 마다
0 15 10 ? * 6#3 매월 세번째 금요일 10:15am 마다
0 0 12 1/5 * ? 매월 첫번째 5일 정오(12pm) 마다
0 11 11 11 11 ? 매년 11월 11일 11:11am 마다




출처 : http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html


댓글