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
ChatGPT의 말:
PostgreSQL에서 오늘 날짜 기준으로 자정(00시00분00초) 이후의 데이터를 조회하는 쿼리는 다음과 같이 작성할 수 있습니다.
이 쿼리는 date_trunc('day', NOW()) 함수를 사용하여 오늘의 자정 시간을 얻은 다음, 해당 시간 이후의 데이터를 조회합니다. your_table과 your_timestamp_column을 실제 테이블 이름과 컬럼 이름으로 대체하시면 됩니다.
나의 말:
ChatGPT의 말:
Quartz Scheduler에서 "stored durably" 기능은 주로 Job의 속성에 관련된 설정을 의미합니다.
storedDurably는 Quartz에서 내구성이 있는 작업을 정의하는 데 사용됩니다. 기본적으로 Quartz에서 Job은 Trigger에 의해 예약되어 실행됩니다. 만약 Trigger가 없으면 Job은 스케줄러에 의해 제거됩니다. 그러나 storedDurably 속성이 true로 설정된 Job은 Trigger가 없더라도 스케줄러에 남아 있게 됩니다.
즉, Trigger가 없는 상태에서도 Job을 유지하고 싶을 때 storedDurably를 사용합니다. 이는 나중에 특정 조건에서 이 Job을 실행할 필요가 있거나, 이후에 Trigger를 추가할 계획이 있을 때 유용합니다.
주요 요점:
- Trigger 없이 Job 유지: storedDurably가 설정된 Job은 Trigger가 없더라도 스케줄러에서 제거되지 않음.
- 수동 트리거: 이런 Job들은 나중에 수동으로 트리거될 수도 있습니다.
사용 예시
위 코드에서 storeDurably(true)를 설정함으로써 이 Job은 Trigger가 없어도 스케줄러에서 제거되지 않습니다.
따라서 storedDurably는 특정 상황에서 Job을 유지하면서, 이후에 트리거를 추가하거나, 수동으로 실행할 수 있도록 하는 기능을 제공합니다.
나의 말:
ChatGPT의 말:
Quartz 스케줄러에서 작업을 즉시 시작하지 않도록 하기 위해 몇 가지 방법이 있습니다. 가장 일반적인 방법은 Trigger의 시작 시간을 제어하는 것입니다.
1. Trigger의 시작 시간을 지연 설정
Trigger의 시작 시간을 현재 시점보다 이후로 설정하면 작업이 바로 시작되지 않도록 할 수 있습니다.
예를 들어, 작업을 5분 후에 시작하도록 설정하려면:
여기서 startAt 메서드를 사용하여 Trigger가 5분 후에 실행되도록 설정하였습니다. 이 방법은 특정 시간 이후에 작업이 실행되도록 하여, 즉시 시작되지 않게 합니다.
2. Trigger를 수동으로 시작
Trigger를 수동으로 시작하여 원하는 시점에 작업을 실행하도록 할 수도 있습니다. 이 경우 작업을 스케줄러에 등록할 때 Trigger를 생성하지 않고, 나중에 트리거를 추가하거나 수동으로 트리거할 수 있습니다.
예를 들어 storeDurably(true) 옵션을 사용해 Job을 스케줄러에 등록하고 나중에 수동으로 트리거할 수 있습니다.
이 경우 Job은 스케줄러에 등록되지만 Trigger가 없으므로 바로 실행되지 않습니다. 나중에 triggerJob 메서드를 사용해 수동으로 실행할 수 있습니다.
3. Misfire 정책 설정
만약 Trigger가 실행되기 전에 스케줄러가 중지되거나 기타 이유로 실행되지 않았을 경우에 트리거가 즉시 실행되지 않게 하고 싶다면 Misfire 정책을 조정할 수 있습니다. Misfire 정책은 Trigger가 제 시간에 실행되지 않았을 때 어떻게 처리할지를 결정하는 설정입니다.
예를 들어, SimpleTrigger의 Misfire 정책을 설정할 수 있습니다.
이렇게 설정하면 Misfire 상황에서도 트리거가 바로 실행되지 않고 기존 스케줄을 유지하면서 실행됩니다.
이 방법들을 통해 Quartz 스케줄러에서 작업이 바로 시작되지 않도록 제어할 수 있습니다.
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();