using EnvelopeGenerator.ServiceHost.Jobs; using Microsoft.Extensions.Options; namespace EnvelopeGenerator.ServiceHost; public class Worker : BackgroundService { private readonly ILogger _logger; private readonly WorkerOptions _options; private readonly JobStateManager _jobStateManager; private readonly IServiceScopeFactory _scopeFactory; public Worker(ILogger logger, IOptions options, JobStateManager jobStateManager, IServiceScopeFactory scopeFactory) { _logger = logger; _options = options.Value; _jobStateManager = jobStateManager; _scopeFactory = scopeFactory; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); } if (_jobStateManager.GetState() == State.Running) { using var scope = _scopeFactory.CreateScope(); var finalizeDocumentJob = scope.ServiceProvider.GetRequiredService(); await finalizeDocumentJob.ExecuteAsync(stoppingToken); } await Task.Delay(_options.DelayMilliseconds, stoppingToken); } } }