thewar_server/Server/System/schedule.cs

71 lines
2.1 KiB
C#

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<Scheduler> schedules = new List<Scheduler>();
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<Scheduler>()
.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();
}
}
}