티스토리 뷰
목차
C# Quartz 쿼츠나 크론과 관련된 내용은 여기서 다루지 않고 실제 C#에서 사용하기 위한 소스 예제만을 다룹니다. Cron(또는 Crontab)에서 제공하는 표현식은, 시간별, 일별, 주별, 월별인데, 약간의 꼼수(?)를 발휘해 초 간격의 표현식도 만들 수 있습니다.
가장 낮은 단위부터 생성 소스를 소개합니다.
quartz cron 구동 방식 정리 - 클래스 기준
C# Quartz 1. 초 간격의 표현식 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // "0/5 * * * * ?" public static string GetEverySecond(int second) { string result = string.Empty; if (second > -1 && second < 60) { result += "0/" + second.ToString() + " * * * * ?"; return result; } else { return null; } } | cs |
"0/5 * * * *" 이런 표현식은 5초 마다 동작하겠다는 의미입니다. 그래서 Crontab 함수 인자로 초를 받습니다.
C# Quartz 2. 몇 시 몇 분 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 0 0 0/1 1/1 * ? public static string GetEveryHour(int minute) { string result = string.Empty; if (minute > -1 && minute < 60) { result = "0 "; result += minute.ToString(); result += " 0/1 1/1 * ?"; return result; } else { return null; } } | cs |
"0 3 0/1 1/1 * ?" 이 표현식은 매 시, 몇 분에 동작하겠다는 의미죠. 그래서 분에 해당하는 인자를 받습니다.
- 1시 3분
- 2시 3분
- 3시 3분
- ...
C# Quartz 3. 매일 몇 시 몇 분 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public static string GetEveryDay(DateTime dateTime) { //0 4-6 * * * 명령어 => 매일 오후 4,5,6시 try { if (DateTimeChecker(dateTime) == false) return null; string result = string.Empty; result = "0 "; result += dateTime.Minute.ToString(); result += " "; result += dateTime.Hour.ToString(); result += " 1/1 * ?"; return result; } catch (Exception e) { return null; } } public static string GetEveryDay(int hour, int minute) { //0 4-6 * * * 명령어 => 매일 오후 4,5,6시 try { if (hour > 24 || hour < 1 || minute > 59 || minute < 0) { return null; } else { string result = string.Empty; result = "0 "; result += minute.ToString(); result += " "; result += hour.ToString(); result += " 1/1 * ?"; return result; } } catch (Exception e) { return null; } } | cs |
"0 6 2 1/1 * ?" 이 표현식은 매일 2시 6분에 동작하겠다는 의미입니다. 함수 인자는 DateTime나 int형 변수 2개를 받는 형태입니다. Crontab 표현식으로 봤을 땐, 둘 다 똑같아요.
C# Quartz 4. 일주일에 한 번 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | public static string GetEveryWeek(DayOfWeek day, DateTime dateTime) { // 1. 요일 검사, 0~6, if ((int)day > 6 && (int)day < 0) return null; // 2. 시, 분 검사 if (DateTimeChecker(dateTime) == false) return null; string daySplit = day.ToString().Substring(0, 3).ToUpper(); if (string.IsNullOrEmpty(daySplit) == true) { return null; } string result = string.Empty; // 0 45 15 Wednesday * // 0 45 15 ? * THU * result = "0 "; result += dateTime.Minute.ToString(); result += " "; result += dateTime.Hour.ToString(); result += " ? * "; result += daySplit; result += " *"; return result; } public static string GetEveryWeek(DayOfWeek day, int hour, int minute) { // 1. 요일 검사, 0~6, if ((int)day > 6 && (int)day < 0) return null; // 2. 시, 분 검사 if (hour > 24 || hour < 1 || minute > 59 || minute < 0) return null; string daySplit = day.ToString().Substring(0, 3).ToUpper(); if (string.IsNullOrEmpty(daySplit) == true) { return null; } string result = string.Empty; // 0 45 15 Wednesday * // 0 45 15 ? * THU * result = "0 "; result += minute.ToString(); result += " "; result += hour.ToString(); result += " ? * "; result += daySplit; result += " *"; return result; } | cs |
C# Quartz 5. 한달에 한 번 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public static string GetEveryMonth(int date, DateTime time) { // 1. day 검사 if (date > 30 && date < 1) return null; // 2.월, 시, 분 검사 if (DateTimeChecker(time) == false) return null; //15 1 1 * * 명령어 => 매월 1일 새벽 1:15 string result = string.Empty; result += time.Second.ToString(); result += " "; result += time.Minute.ToString(); result += " "; result += time.Hour.ToString(); result += " "; result += date.ToString(); result += " "; result += "1/1"; result += " ? *"; return result; } public static string GetEveryMonth(int date, int hour, int minute) { // 1. day 검사 if (date > 30 && date < 1) return null; // 2.월, 시, 분 검사 if (hour > 24 || hour < 1 || minute > 59 || minute < 0) return null; //15 1 1 * * 명령어 => 매월 1일 새벽 1:15 string result = string.Empty; result += "0 "; result += minute.ToString(); result += " "; result += hour.ToString(); result += " "; result += date.ToString(); result += " "; result += "1/1"; result += " ? *"; return result; } | cs |
이상 5개의 기능을 소개했고, 저는 Crontab 크론 문법 확인하는 용도로 아래 사이트를 이용합니다.
링크 - CronMaker [클릭]
[C# 스케줄러 cron 표현식]
제가 여기서 다뤄보니 100% 확실하다는 것을 알았습니다.
Cron 문법을 만들어주는 사이트가 저기 말고도 몇 군데 있는데, 저곳 표현식만 100% 들어맞고 다른 곳은 안 되는 경우가 종종 생기더라고요. 무조건 CronMaker.com 이용하시길 추천합니다. Crontab 표현식 만들어주는 사이트 중에선 최고입니다.
관련 글
C# 스케줄러 Quartz.net 사용 방법 (Cron 포함)
C# Quartz 스케줄러, 초 단위 설정 Cron 문법 (닷넷 타이머 예제 소스)
LVDT 응용, 실시간 모니터링 위한 시스템 통신 구성