Quartz Scheduler는 Job을 등록할 때, 설정된 스케줄의 시작 시간이 현재 시간보다 과거에 있을 경우, 해당 작업을 misfire 상태로 판단합니다.
Misfire는 스케줄에 따라 수행되어야 할 작업이 무엇인가의 이유로 제때 실행되지 못한 상황을 의미합니다.
이는 서버 중지, 시스템 오류 또는 리소스 부족 등 다양한 이유로 발생할 수 있습니다.
기본적으로, Quartz Scheduler는 misfire 상태의 작업을 발견하면 가능한 한 빠르게 해당 작업을 실행하려고 시도합니다.
즉, 시스템이 정상화되어 다시 작동을 시작하면 과거에 수행되지 못했던 작업이 즉시 실행됩니다.
이 기능은 스케줄링의 정확성을 보장하는 데 중요한 역할을 합니다.
하지만 즉시 실행을 방지하려고 하는 경우 아래처럼 코딩합니다.
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.AddMinutes(-10), EndTime = DateTime.Now.AddMinutes(10) });
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")
.StartAt(job.StartTime)
.EndAt(job.EndTime)
.WithCronSchedule(job.CronExpression!, cronScheduleBuilder => cronScheduleBuilder.WithMisfireHandlingInstructionDoNothing()) // 즉시 실행 방지
//.WithCronSchedule(job.CronExpression!)
.Build();
// Scheduler 에 Job 추가
await scheduler.ScheduleJob(jobdetail, trigger);
}
// Scheduler 시작
await scheduler.Start();
Console.ReadLine();
}
}
}
위 코드에서 cronScheduleBuilder.WithMisfireHandlingInstructionDoNothing() 으로 처리하면
scheduler.Start() 시 등록된 Job 에 대해 즉시 실행을 방지하게 됩니다.
소스
https://github.com/kei-soft/QuartzSchedulerTest
참고
https://nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html
데이터를 동적 조건으로 쿼리하기 (0) | 2024.08.23 |
---|---|
Naver 사이트 열어 특정 단어 검색하기 (0) | 2024.08.22 |
C# Double/float 연산 결과가 이상할 때 처리 방법 (부동소수점 연산) (0) | 2024.07.16 |
xml 파일 로드 시 에러 : hexadecimal value 0x0C, is an invalid character. (0) | 2024.07.14 |
WordPress API - Post 수정하기 (0) | 2024.07.07 |