📄
IntervalScheduler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using Quartz; internal static class QuartzScheduling { public static readonly JobKey ScheduleMonitoringChecksJobKey = JobKey.Create(nameof(ScheduleMonitoringChecksJob)); public static readonly TriggerKey ScheduleMonitoringChecksTriggerKey = new( "interval", nameof(ScheduleMonitoringChecksJob) ); } internal sealed class IntervalScheduler(ISchedulerFactory schedulerFactory, ScreeningRepository repository) { public async Task ApplyStoredIntervalAsync(CancellationToken cancellationToken = default) { var settings = await repository.GetAppSettingsAsync(cancellationToken); await RescheduleAsync(settings.IntervalSeconds, cancellationToken); } public async Task RescheduleAsync(int intervalSeconds, CancellationToken cancellationToken = default) { var scheduler = await schedulerFactory.GetScheduler(cancellationToken); var seconds = Math.Max(60, intervalSeconds); var trigger = TriggerBuilder .Create() .ForJob(QuartzScheduling.ScheduleMonitoringChecksJobKey) .WithIdentity(QuartzScheduling.ScheduleMonitoringChecksTriggerKey) .StartNow() .WithSimpleSchedule(s => s.WithIntervalInSeconds(seconds).RepeatForever()) .Build(); if (await scheduler.CheckExists(QuartzScheduling.ScheduleMonitoringChecksTriggerKey, cancellationToken)) { await scheduler.RescheduleJob( QuartzScheduling.ScheduleMonitoringChecksTriggerKey, trigger, cancellationToken ); } } }