KeiStory


Quartz Scheduler misfire 처리하기 - 즉시 실행 방지

 

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

 

GitHub - kei-soft/QuartzSchedulerTest

Contribute to kei-soft/QuartzSchedulerTest development by creating an account on GitHub.

github.com

 

참고
https://nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html

 

Quartz scheduler misfire instructions explained

Podcast for developers, testers, SREs… and their managers. I explain complex and convoluted technologies in a clear way, avoiding buzzwords and hype. Never longer than 4 minutes and 16 seconds.

nurkiewicz.com

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band