using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Quartz; using static PostFundManagement.Domain.Extensions.Constants; namespace PostFundManagement.Application.Extensions; public static class Quartz { public static IServiceCollection AddQuartzSchedulerClient(this IServiceCollection services, string schedulerName, IConfiguration configuration) { var connectionString = configuration.GetConnectionString(DatabaseConfigName); services.Configure(options => { options.Properties["quartz.scheduler.instanceName"] = schedulerName; options.Properties["quartz.scheduler.instanceId"] = "AUTO"; }); services.ConfigureCommon(); services.AddQuartz(config => { config.UseSimpleTypeLoader(); config.UseDefaultThreadPool(options => options.MaxConcurrency = 0); config.UseTimeZoneConverter(); config.UsePersistentStore(storage => { storage.ProvisionSchema(); storage.UsePostgres(options => options.ConnectionString = connectionString!); storage.UseSystemTextJsonSerializer(); storage.UseClustering(cluster => { cluster.CheckinInterval = TimeSpan.FromSeconds(30); cluster.CheckinMisfireThreshold = TimeSpan.FromSeconds(90); }); }); }); return services; } public static IServiceCollection AddQuartzScheduler(this IServiceCollection services, string schedulerName, IConfiguration configuration) { var connectionString = configuration.GetConnectionString(DatabaseConfigName); services.Configure(options => { options.Properties["quartz.scheduler.instanceName"] = schedulerName; options.Properties["quartz.scheduler.instanceId"] = "AUTO"; options.Properties["quartz.scheduler.batchTriggerAcquisitionMaxCount"] = "5"; options.Properties["quartz.jobStore.misfireThreshold"] = TimeSpan.FromMinutes(2).TotalMilliseconds.ToString(CultureInfo.InvariantCulture); options.Properties["quartz.plugin.jobHistory.type"] = "Quartz.Plugin.History.LoggingJobHistoryPlugin, Quartz.Plugins"; options.Properties["quartz.plugin.triggerHistory.type"] = "Quartz.Plugin.History.LoggingTriggerHistoryPlugin, Quartz.Plugins"; }); services.ConfigureCommon(); services.AddQuartzHostedService(options => { options.WaitForJobsToComplete = true; }); services.AddQuartz(config => { config.UseSimpleTypeLoader(); config.UseDefaultThreadPool(options => options.MaxConcurrency = 5); config.UseTimeZoneConverter(); config.UsePersistentStore(storage => { storage.ProvisionSchema(); storage.UsePostgres(options => options.ConnectionString = connectionString!); storage.UseSystemTextJsonSerializer(); storage.UseClustering(cluster => { cluster.CheckinInterval = TimeSpan.FromSeconds(30); cluster.CheckinMisfireThreshold = TimeSpan.FromSeconds(90); }); }); }); return services; } private static IServiceCollection ConfigureCommon(this IServiceCollection services) { services.Configure(options => options.Scheduling.IgnoreDuplicates = true); services.AddTransient(); services.AddTransient(); return services; } }