KeiStory

C# Quartz Scheduler 사용하기 - Cron 표기법 사용

 

Quartz 를 이용해서 Scheduler 를 구현하는 방법입니다.

Quartz.NET 을 이용하며 아래 사이트에서 Document 를 보면 자세한 내용을 알 수 있습니다.

https://www.quartz-scheduler.net/

 

Home | Quartz.NET

 

www.quartz-scheduler.net

 

Quartz Scheduler 에서는 Cron 표기법을 지원하고 있습니다.

Cron 표기법에 대한 설명은 아래 사이트로 대신합니다.

https://www.quartz-scheduler.net/documentation/quartz-3.x/how-tos/crontrigger.html#format

 

Using the CronTrigger | Quartz.NET

Using the Cron Trigger Introduction cron is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven. The CronTrigger class is based on the scheduling capabilities of cron. CronTrigger uses "cron expressions"

www.quartz-scheduler.net

아래 사이트에서 Cron 표기법을 쉽게 만들 수 있습니다.

http://www.cronmaker.com/

 

CronMaker

 

www.cronmaker.com

 

Console App 프로젝트를 생성합니다.

1. Quartz Nuget Package 를 설치합니다.

 

2. Job 실행 내용을 정의합니다.

using Quartz;

namespace QuartzSchedulerTest
{
    internal class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync($"{DateTime.Now} | Execute Job : [{context.JobDetail.Key.Name}]");
        }
    }
}

위 내용은 작업 수행시 콘솔에 로그를 출력합니다.

 

3. Job 내용을 정의한 클래스를 정의합니다.

namespace QuartzSchedulerTest
{
    internal class JobInfo
    {
        /// <summary>
        /// Job Key
        /// </summary>
        public string? Key { get; set; }
        /// <summary>
        /// Corn 표현식
        /// </summary>
        public string? CronExpression { get; set; }
        /// <summary>
        /// Job 시작 시간
        /// </summary>
        public DateTime StartTime { get; set; }
        /// <summary>
        /// Job 종료 시간
        /// </summary>
        public DateTime EndTime { get; set; }
    }
}

Cron 표현식 기준으로 Job 이 실행되며 StartTime 에 시작하고 EndTime 에 종료를 하기 위함입니다.

 

4. Job 을 등록하고 Schedule을 실행합니다.

using Quartz;
using Quartz.Impl;
using Quartz.Logging;

namespace QuartzSchedulerTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();
            program.Start();
        }

        public async void Start()
        {
            LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());

            StdSchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = await factory.GetScheduler();

            // Job 목록 생성
            List<JobInfo> jobList = new List<JobInfo>();

            jobList.Add(new JobInfo() { Key = "1", CronExpression = "0/5 * * * * ?", StartTime = DateTime.Now, EndTime = DateTime.Now.AddSeconds(30) });
            jobList.Add(new JobInfo() { Key = "2", CronExpression = "0/10 * * * * ?", StartTime = DateTime.Now, EndTime = DateTime.Now.AddSeconds(30) });
            jobList.Add(new JobInfo() { Key = "3", CronExpression = "0/15 * * * * ?", StartTime = DateTime.Now, EndTime = DateTime.Now.AddSeconds(30) });

            foreach (var job in jobList)
            {
                // Job 정의
                IJobDetail jobdetail = JobBuilder.Create<TestJob>()
                             .WithIdentity(job.Key)
                             .Build();

                // Job 주기 정의
                ITrigger trigger = TriggerBuilder.Create()
                                    .WithIdentity($"{job.Key}_trigger")
                                    .StartNow()
                                    .WithCronSchedule(job.CronExpression)
                                    .Build();

                // Scheduler 에 Job 추가
                await scheduler.ScheduleJob(jobdetail, trigger);
            }

            // Scheduler 시작
            await scheduler.Start();

            Console.ReadLine();
        }
    }
}

Job 1 은 5초마다 실행되고 Job 2 는 10초마다, Job 3 은 15초 마다 실행됩니다.

모두 실행시간 기준 30초 뒤에 종료됩니다.

* ConsoleLogProvider 를 이용하면 로그레벨에 따른 처리가 가능합니다.

 

결과

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band