티스토리 뷰

목차

    반응형

    C# Quartz 쿼츠나 크론과 관련된 내용은 여기서 다루지 않고 실제 C#에서 사용하기 위한 소스 예제만을 다룹니다. Cron(또는 Crontab)에서 제공하는 표현식은, 시간별, 일별, 주별, 월별인데, 약간의 꼼수(?)를 발휘해 초 간격의 표현식도 만들 수 있습니다.


    가장 낮은 단위부터 생성 소스를 소개합니다.


    c# quartz cron 문법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(03).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(03).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 크론 문법 확인하는 용도로 아래 사이트를 이용합니다.



    cron maker c# quartz[C# 스케줄러 cron 표현식]


    제가 여기서 다뤄보니 100% 확실하다는 것을 알았습니다.


    Cron 문법을 만들어주는 사이트가 저기 말고도 몇 군데 있는데, 저곳 표현식만 100% 들어맞고 다른 곳은 안 되는 경우가 종종 생기더라고요. 무조건 CronMaker.com 이용하시길 추천합니다. Crontab 표현식 만들어주는 사이트 중에선 최고입니다.


    관련 글

    C# 스케줄러 Quartz.net 사용 방법 (Cron 포함)

    C# Quartz 스케줄러, 초 단위 설정 Cron 문법 (닷넷 타이머 예제 소스)

    임베디드 리눅스 시스템, 교차 개발 환경과 부트로더

    LVDT 응용, 실시간 모니터링 위한 시스템 통신 구성

    자바 쓰레드 안전성을 위한 동기화, 캡슐화 (thread safety 방법)

    [삼성바다 IT상식] OS, PLATFORM 차이

    반응형