티스토리 뷰
목차
유닉스/리눅스 계열에서 스케쥴링을 제공하는 Cron은 그 사용법이 간편해서 많은 사랑을 받고 있습니다.
C#에서도 윈도우 스케쥴링을 위해 Cron을 기반의 Quartz 라이브러리가 제공됩니다. 타이머나 스레드를 이용할 필요 없이 C# 스케줄러 Quartz만 사용하면 스케쥴링 프로그래밍이 가능합니다.
이 포스트에선 쿼츠 이용하는 방법을 다룹니다. 먼저, Quartz.NET 사이트로 이동해 파일을 다운로드합니다.
[C# 스케쥴러 scheduler example] 쿼츠 사용법
링크된 사이트로 이동한 뒤 오른쪽 빨간 박스 안의 Download를 클릭하세요.
[C# 스케쥴러 scheduler example] Download Quartz.NET 다운로드
그러면 소스 포지로 이동하는 링크를 볼 수 있습니다.
바로 이동하여 C# 스케줄러 다운로드하세요.
윈도우 스케줄러 쿼츠 사용법, 소스 포지에서 다운로드
2017년 3월 현재 2.4.1이 최신 버전입니다. 솔직히 크론이 크게 바뀌지 않는 이상에야 Quartz도 바뀔 일이 뭐 있나 싶기도 합니다.
어쨌든 파일을 다운로드하고 압축을 풀어보세요.
[C# 스케쥴러 scheduler example] 쿼츠 사용법
위 그림처럼 비주얼 스튜디오 2010으로 생성된 C# 스케줄러 예제 프로젝트가 보입니다.
[C# 스케쥴러 scheduler example] 쿼츠 사용법
프로젝트를 열어보면 폴더 트리가 확인되는데, 저는 성격상 프로젝트야 어떻든, 일단 실행시켜 눈으로 뭔가를 확인하고 싶어 합니다.
그래서 Debug 폴더로 이동해 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(null, 15); // 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# 스케쥴러 scheduler example] 쿼츠 사용법
Cron과 스케줄러 관련 글
- [Crontab] C# Quartz Cron 사용법 - 초 시 분 월 주 달 표현식
- C# Quartz 스케줄러, 초 단위 설정 Cron 문법 (닷넷 타이머 예제 소스)
- [삼성바다 IT상식] OS, PLATFORM 차이
- 윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)
- WinCE 저전력 모드 프로그래밍 주의 사항 (윈도우 CE 스케줄링)
- C++ 멀티스레드 디버깅 방법 2가지, 메시지와 sleep 이용한 이론