using Database.Database; using Esim.SendMail.Jobs; using Esim.SendMail.Services; using Microsoft.EntityFrameworkCore; using Quartz; namespace Esim.SendMail; public class Program { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); public static async Task Main(string[] args) { // Configure log4net var logRepository = log4net.LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()); log4net.Config.XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); log.Info("==========================================="); log.Info("Esim.SendMail Service Starting..."); log.Info("==========================================="); var builder = Host.CreateApplicationBuilder(args); // Add configuration builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); // Add DbContext var connectionString = builder.Configuration["Connection"]; builder.Services.AddDbContext(options => options.UseOracle(connectionString)); // Add Email Service as singleton for connection pooling builder.Services.AddSingleton(); // Configure Quartz var jobIntervalSeconds = int.Parse(builder.Configuration["Job:IntervalSeconds"] ?? "10"); builder.Services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionJobFactory(); var jobKey = new JobKey("MessageQueueJob"); q.AddJob(opts => opts.WithIdentity(jobKey)); q.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity("MessageQueueJob-trigger") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(jobIntervalSeconds) .RepeatForever())); }); builder.Services.AddQuartzHostedService(q => { q.WaitForJobsToComplete = true; }); var host = builder.Build(); log.Info($"Job interval: {jobIntervalSeconds} seconds"); log.Info("Service started successfully. Press Ctrl+C to stop."); await host.RunAsync(); } }