Refactor: Replace EmailSenderWorker with AsyncIniteWorker

Removed EmailSenderWorker and its configuration, including
EmailSenderWorkerConfiguration. Introduced AsyncIniteWorker
as a replacement, simplifying the design by removing
configuration-based toggling.

- Deleted EmailSenderWorkerConfiguration.cs.
- Removed EmailSenderWorker and its registration from Program.cs.
- Registered AsyncIniteWorker in DependencyInjection.cs.
- Renamed and refactored EmailSenderWorker to AsyncIniteWorker.
- Updated namespace and removed unused configuration dependencies.
This commit is contained in:
2026-07-24 11:54:34 +02:00
parent 4a6af885de
commit d91ed70001
4 changed files with 11 additions and 35 deletions

View File

@@ -1,11 +0,0 @@
namespace DigitalData.EmailProfiler.API.Configurations;
/// <summary>
/// Configuration for EmailSenderWorker
/// </summary>
public class EmailSenderWorkerConfiguration
{
public const string SectionName = "Workers:EmailSender";
public bool Enabled { get; set; } = true;
}

View File

@@ -1,6 +1,4 @@
using DigitalData.EmailProfiler.API.Configurations;
using DigitalData.EmailProfiler.API.Middleware; using DigitalData.EmailProfiler.API.Middleware;
using DigitalData.EmailProfiler.API.Workers;
using DigitalData.EmailProfiler.Application; using DigitalData.EmailProfiler.Application;
using DigitalData.EmailProfiler.Application.Common.Dtos; using DigitalData.EmailProfiler.Application.Common.Dtos;
using DigitalData.EmailProfiler.Infrastructure; using DigitalData.EmailProfiler.Infrastructure;
@@ -43,16 +41,10 @@ try
// Register Infrastructure layer (RabbitMQ, Repositories, etc.) // Register Infrastructure layer (RabbitMQ, Repositories, etc.)
builder.Services.AddInfrastructure(builder.Configuration); builder.Services.AddInfrastructure(builder.Configuration);
// Register EmailSenderWorker configuration
builder.Services.Configure<EmailSenderWorkerConfiguration>(builder.Configuration.GetSection(EmailSenderWorkerConfiguration.SectionName));
// Register EmailAccount configuration (IOptions<EmailAccountDto>) // Register EmailAccount configuration (IOptions<EmailAccountDto>)
builder.Services.Configure<EmailAccountDto>( builder.Services.Configure<EmailAccountDto>(
builder.Configuration.GetSection("EmailAccount")); builder.Configuration.GetSection("EmailAccount"));
// Register Background Workers
builder.Services.AddHostedService<EmailSenderWorker>();
builder.Services.AddControllers(); builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();

View File

@@ -2,6 +2,7 @@ using DigitalData.EmailProfiler.Application.Common.Interfaces;
using DigitalData.EmailProfiler.Infrastructure.Messaging; using DigitalData.EmailProfiler.Infrastructure.Messaging;
using DigitalData.EmailProfiler.Infrastructure.Queue; using DigitalData.EmailProfiler.Infrastructure.Queue;
using DigitalData.EmailProfiler.Infrastructure.Services; using DigitalData.EmailProfiler.Infrastructure.Services;
using DigitalData.EmailProfiler.Infrastructure.Services.Background;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@@ -42,6 +43,9 @@ public static class DependencyInjection
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys")) .PersistKeysToFileSystem(new DirectoryInfo(@"C:\ProgramData\EmailService\Keys"))
.SetApplicationName("EmailProfiler"); .SetApplicationName("EmailProfiler");
// Register Background Workers
services.AddHostedService<AsyncIniteWorker>();
return services; return services;
} }
} }

View File

@@ -1,29 +1,20 @@
using DigitalData.EmailProfiler.API.Configurations;
using DigitalData.EmailProfiler.Application.Common.Interfaces; using DigitalData.EmailProfiler.Application.Common.Interfaces;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace DigitalData.EmailProfiler.API.Workers; namespace DigitalData.EmailProfiler.Infrastructure.Services.Background;
/// <summary> /// <summary>
/// Background worker that processes outgoing emails from RabbitMQ queue. /// Background worker that processes outgoing emails from RabbitMQ queue.
/// Uses event-driven RabbitMQ consumer (push-based) instead of polling. /// Uses event-driven RabbitMQ consumer (push-based) instead of polling.
/// NO database operations - email account configuration comes from appsettings. /// NO database operations - email account configuration comes from appsettings.
/// </summary> /// </summary>
public class EmailSenderWorker( public class AsyncIniteWorker(
IOutgoingEmailQueue EmailQueue, IOutgoingEmailQueue EmailQueue,
ILogger<EmailSenderWorker> Logger, ILogger<AsyncIniteWorker> Logger) : BackgroundService
IOptions<EmailSenderWorkerConfiguration> configuration) : BackgroundService
{ {
private readonly EmailSenderWorkerConfiguration _config = configuration.Value;
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
if (!_config.Enabled)
{
Logger.LogInformation("EmailSenderWorker is disabled in configuration");
return;
}
Logger.LogInformation("EmailSenderWorker started (event-driven RabbitMQ consumer)"); Logger.LogInformation("EmailSenderWorker started (event-driven RabbitMQ consumer)");
try try
@@ -32,7 +23,7 @@ public class EmailSenderWorker(
await EmailQueue.InitAsync(stoppingToken); await EmailQueue.InitAsync(stoppingToken);
// Keep worker alive until cancellation // Keep worker alive until cancellation
await Task.Delay(Timeout.Infinite, stoppingToken); // await Task.Delay(Timeout.Infinite, stoppingToken);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
@@ -44,6 +35,6 @@ public class EmailSenderWorker(
throw; throw;
} }
Logger.LogInformation("EmailSenderWorker stopped"); // Logger.LogInformation("EmailSenderWorker stopped");
} }
} }