using Quartz; using Quartz.Impl; namespace Server.System { public abstract class Scheduler : IJob { private string _cron; public string cron { get { return _cron; } } public Scheduler(string cronData) { _cron = cronData; } public abstract void Process(); public async Task Execute(IJobExecutionContext context) { Console.WriteLine("Job 실행됨: " + DateTime.Now); Process(); await Task.CompletedTask; } } public class schedule { private IScheduler scheduler; private List schedules = new List(); public void Add(Scheduler scheduler) { schedules.Add(scheduler); } public async Task Start() { Console.WriteLine("scheduler: " + schedules.Count); // 스케줄러 생성 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = await schedulerFactory.GetScheduler(); // 스케줄러 시작 await scheduler.Start(); // schedules에 있는 스케줄들을 스케줄러에 등록 foreach (var schedule in schedules) { IJobDetail job = JobBuilder.Create() .WithIdentity(schedule.GetType().Name, "group" + schedule.GetType().Name) // Scheduler 클래스의 이름을 사용하여 고유한 ID 생성 .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity(schedule.GetType().Name + "Trigger", "group" + schedule.GetType().Name) .WithCronSchedule(schedule.cron) // 스케줄의 cron 표현식 사용 .Build(); await scheduler.ScheduleJob(job, trigger); } // 프로그램이 종료되지 않도록 대기 await Task.Delay(TimeSpan.FromDays(365)); } public async Task Stop() { // 스케줄러 중지 await scheduler.Shutdown(); } } }