본문 바로가기
C++ 200제/코딩 IT 정보

[C# Cron] 윈도우 스케줄러 Quartz net 사용법

by vicddory 2017. 3. 13.

유닉스/리눅스 계열에서 스케쥴링을 제공하는 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과 스케줄러 관련 글


댓글