using Quartz; using Quartz.Impl; using Serilog; namespace MasstransferCommon.scheduler; public class SchedulerHelper { private static readonly Lazy lazyScheduler = new(() => InitSchedulerAsync().GetAwaiter().GetResult()); private static readonly Dictionary _jobDetails = new(); private static IScheduler Scheduler => lazyScheduler.Value; private static async Task InitSchedulerAsync() { try { return await new StdSchedulerFactory().GetScheduler(); } catch (Exception ex) { Log.Error($"Failed to initialize scheduler: {ex.Message}"); throw; } } public static async Task Start() { await Scheduler.Start(); } public static async Task SchedulerInterval(Dictionary? data, int interval, string group = "defaultGroup") where T : IJob { var job = CreateJob(data, group); var trigger = TriggerBuilder.Create() .WithIdentity(typeof(T).Name, group) .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(interval).RepeatForever()) .Build(); await Scheduler.ScheduleJob(job, trigger); } public static async Task SchedulerCorn(Dictionary? data, string? cronExpression, string group = "defaultGroup") where T : IJob { var job = CreateJob(data, group); var trigger = TriggerBuilder.Create() .WithIdentity(typeof(T).Name, group) .StartNow() .WithSchedule(CronScheduleBuilder.CronSchedule(cronExpression)) .Build(); await Scheduler.ScheduleJob(job, trigger); } private static IJobDetail CreateJob(Dictionary? data, string group) where T : IJob { if (_jobDetails.ContainsKey(typeof(T).Name)) return _jobDetails[typeof(T).Name]; var job = JobBuilder.Create() .WithIdentity(typeof(T).Name, group) .Build(); if (data != null && data.Count > 0) foreach (var item in data) job.JobDataMap.Add(item.Key, item.Value); _jobDetails[typeof(T).Name] = job; return job; } public static async Task PauseJob(string group = "defaultGroup") { if (_jobDetails.ContainsKey(typeof(T).Name)) await Scheduler.PauseJob(JobKey.Create(typeof(T).Name, group)); } public static async Task ResumeJob(string group = "defaultGroup") { if (_jobDetails.ContainsKey(typeof(T).Name)) await Scheduler.ResumeJob(JobKey.Create(typeof(T).Name, group)); } public static async Task Shutdown() { if (!Scheduler.IsShutdown) await Scheduler.Shutdown(); } public static async Task TriggerOnceImmediately(string group = "defaultGroup") where T : IJob { if (!_jobDetails.ContainsKey(typeof(T).Name)) return; await Scheduler.TriggerJob(new JobKey(typeof(T).Name, group)); } }