티스토리 뷰

목차

    반응형

    유닉스/리눅스 계열에서 스케쥴링을 제공하는 Cron은 그 사용법이 간편해서 많은 사랑을 받고 있습니다.


    C#에서도 윈도우 스케쥴링을 위해 Cron을 기반의 Quartz 라이브러리가 제공됩니다. 타이머나 스레드를 이용할 필요 없이 C# 스케줄러 Quartz만 사용하면 스케쥴링 프로그래밍이 가능합니다.


    이 포스트에선 쿼츠 이용하는 방법을 다룹니다. 먼저, Quartz.NET 사이트로 이동해 파일을 다운로드합니다.


    Quartz.NET 사이트[C# 스케쥴러 scheduler example] 쿼츠 사용법


    링크된 사이트로 이동한 뒤 오른쪽 빨간 박스 안의 Download를 클릭하세요.


    Download Quartz.NET 다운로드[C# 스케쥴러 scheduler example] Download Quartz.NET 다운로드


    그러면 소스 포지로 이동하는 링크를 볼 수 있습니다.


    바로 이동하여 C# 스케줄러 다운로드하세요.


    소스 포지에서 쿼츠 다운로드윈도우 스케줄러 쿼츠 사용법, 소스 포지에서 다운로드


    2017년 3월 현재 2.4.1이 최신 버전입니다. 솔직히 크론이 크게 바뀌지 않는 이상에야 Quartz도 바뀔 일이 뭐 있나 싶기도 합니다.


    어쨌든 파일을 다운로드하고 압축을 풀어보세요.


    예제 프로젝트 실행[C# 스케쥴러 scheduler example] 쿼츠 사용법


    위 그림처럼 비주얼 스튜디오 2010으로 생성된 C# 스케줄러 예제 프로젝트가 보입니다. 


    쿼츠 예제 프로젝트 트리[C# 스케쥴러 scheduler example] 쿼츠 사용법


    프로젝트를 열어보면 폴더 트리가 확인되는데, 저는 성격상 프로젝트야 어떻든, 일단 실행시켜 눈으로 뭔가를 확인하고 싶어 합니다.


    그래서 Debug 폴더로 이동해 exe 파일을 먼저 실행해 보겠습니다.

    예제 exe 파일 실행[C# 스케쥴러 scheduler example] 쿼츠 사용법


    보이시죠? exe가 있어요. 바로 실행해 봅니다.


    쿼츠 예제 실행 결과[C# 스케쥴러 scheduler example] 쿼츠 사용법


    뭔가 실행됩니다. 근데, 로그도 뭘 알아야 읽죠... 몰라요. 그래서 소스를 봐야 해요. 괜히 exe 먼저 실행시켰나 봅니다.


    어쨌든, 일단 테스트라도 해보려면 샘플이 필요하죠. 저도 바로 위 단계에서 좀 막혀 이래저래 살펴봤는데, 아래처럼 소스 코드를 구성해 C# 스케줄러 예제를 돌려봤습니다.


    1. Cron Trigger

    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
    namespace QuartzCronExample.Job
    {
        public class SimpleTriggerExample
        {
            static log4net.ILog log = log4net.LogManager.GetLogger(typeof(SimpleTriggerExample));
            // First we must get a reference to a scheduler
            ISchedulerFactory sf;
            public IScheduler sched { get; private set; }
     
            public SimpleTriggerExample()
            {
                sf = new StdSchedulerFactory();
                sched = sf.GetScheduler();
            }
     
            public virtual void Run()
            {
                Console.WriteLine("------- Scheduling Jobs ----------------");
     
                DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null15);
     
                // job1 will only fire once at date/time "ts"
                IJobDetail job = JobBuilder.Create<SimpleJob>()
                    .WithIdentity("job1""group1")
                    .Build();
     
                ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                                              .WithIdentity("trigger1""group1")
                                                              .WithCronSchedule("0/2 * * * * ?")
                                                              .StartAt(startTime)
                                                              .Build();
     
                // schedule it to run!
                DateTimeOffset? ft = sched.ScheduleJob(job, trigger);
                Console.WriteLine(job.Key + " has been scheduled to run at: " + ft
                         + " and repeat based on expression: "
                         + trigger.CronExpressionString);
     
                sched.Start();
            }
        }
    }
    cs


    2. Quartz Job

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    namespace QuartzCronExample.Job
    {
        public class SimpleJob : IJob
        {
            public virtual void Execute(IJobExecutionContext context)
            {
                JobKey jobKey = context.JobDetail.Key;
                Console.WriteLine("SimpleJob says: {0} executing at {1}",
                                    jobKey, DateTime.Now.ToString("r"));
            }
        }
    }
    cs

    3. Main Class

    1
    2
    3
    SimpleTriggerExample cron_exam_ = null;
    cron_exam_ = new SimpleTriggerExample();
    cron_exam_.Run();
    cs


    IJob 인터페이스를 상속받는 클래스를 하나 꾸며봤는데, 어차피 Execute(IJobExecutionContext context)란 가상 함수 하나만 구현해 주면 되는지라 어렵진 않아요.


    저 C# 스케줄러 소스를 기반으로 프로그램을 실행시켜보면 콘솔 창에서 아래 같은 메시지가 확인되죠.


    1
    2
    3
    4
    ------- Scheduling Jobs ----------------
    group1.job1 has been scheduled to run at:
    2017-03-05 오후 12:09:00 +00:00 and repeat based on
    expression: 0/2 * * * * ?
    cs


    3번 라인까진 큰 의미가 있는 건 아닙니다.


    언제 몇 시에 실행했나만 나오는 것이고 중요한 건 아래 Cron 표현 식입니다.


    "0/2 * * * * ?"


    위 표현 식은 2초마다 한 번씩 예약된 스케줄 작업을 구동시킨다는 의미입니다. 이 정도만 확인이 된다면 어쨌든 C# Quartz를 사용할 수 있는 기본 중의 기본 지식은 생긴 겁니다.


    마지막으로 Quartz 라이브러리가 Logging이란 로그 생성 라이브러리도 기본적으로 참조하더라고요. 만약 로그가 제대로 안 찍힌다면, 아래처럼 Quartz 프로젝트 Debug 폴더에 dll 파일이 제대로 위치한 지 확인해 보세요.


    C# 스케줄러 Cron Quartz[C# 스케쥴러 scheduler example] 쿼츠 사용법


    Cron과 스케줄러 관련 글


    반응형