Quartz 를 이용해서 Scheduler 를 구현하는 방법입니다.
Quartz.NET 을 이용하며 아래 사이트에서 Document 를 보면 자세한 내용을 알 수 있습니다.
https://www.quartz-scheduler.net/
Quartz Scheduler 에서는 Cron 표기법을 지원하고 있습니다.
Cron 표기법에 대한 설명은 아래 사이트로 대신합니다.
https://www.quartz-scheduler.net/documentation/quartz-3.x/how-tos/crontrigger.html#format
아래 사이트에서 Cron 표기법을 쉽게 만들 수 있습니다.
Console App 프로젝트를 생성합니다.
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}]");
}
}
}
위 내용은 작업 수행시 콘솔에 로그를 출력합니다.
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 에 종료를 하기 위함입니다.
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 를 이용하면 로그레벨에 따른 처리가 가능합니다.
결과
C# Indexer 사용하기 (0) | 2024.03.04 |
---|---|
C# NATS 를 이용해 Streaming Server 구성하기 (0) | 2024.03.03 |
C# IDataReader 를 이용해 List<T> 로 변환해서 사용하는 방법 (0) | 2024.02.27 |
C# ExpandoObject 객체 Property 값 알아내는 방법 (0) | 2024.02.27 |
C# Edge Browser 열기 (0) | 2024.02.23 |