71 lines
2.1 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|