using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Jobs.APIBackendJobs; using EnvelopeGenerator.Jobs.FinalizeDocument; using EnvelopeGenerator.WorkerService; using EnvelopeGenerator.WorkerService.Configuration; using EnvelopeGenerator.WorkerService.Services; using Quartz; var builder = Host.CreateApplicationBuilder(args); builder.Services.Configure(builder.Configuration.GetSection("WorkerSettings")); builder.Services.AddSingleton(); builder.Services.AddSingleton(provider => { var settings = provider.GetRequiredService>().Value; var logger = provider.GetRequiredService>(); return new PDFBurner(logger, settings.PdfBurner); }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionJobFactory(); q.UseDefaultThreadPool(tp => tp.MaxConcurrency = 5); var settings = new WorkerSettings(); builder.Configuration.GetSection("WorkerSettings").Bind(settings); var intervalMinutes = Math.Max(1, settings.IntervalMinutes); var finalizeJobKey = new JobKey("FinalizeDocumentJob"); q.AddJob(opts => opts .WithIdentity(finalizeJobKey) .UsingJobData(Value.DATABASE, settings.ConnectionString)); q.AddTrigger(opts => opts .ForJob(finalizeJobKey) .WithIdentity("FinalizeDocumentJob-trigger") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInMinutes(intervalMinutes) .RepeatForever())); var apiJobKey = new JobKey("APIEnvelopeJob"); q.AddJob(opts => opts .WithIdentity(apiJobKey) .UsingJobData(Value.DATABASE, settings.ConnectionString)); q.AddTrigger(opts => opts .ForJob(apiJobKey) .WithIdentity("APIEnvelopeJob-trigger") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInMinutes(intervalMinutes) .RepeatForever())); }); builder.Services.AddQuartzHostedService(options => { options.WaitForJobsToComplete = true; }); builder.Services.AddHostedService(); var host = builder.Build(); host.Run();