feat(api, Core, TaskReconciliationWorker): Воркер обработки зависших задач. Доработка логики.

This commit is contained in:
Mikhail Trubnikov
2026-04-23 16:08:16 +10:00
parent 7da2265d1c
commit e8086b3a7d
13 changed files with 275 additions and 6 deletions

View File

@@ -0,0 +1,54 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces;
using PARR.Core.Services.Task.Interfaces;
using PARR.Domain.Settings;
namespace PARR.Core.Services.Task.ReconciliationHosted
{
/// <summary>
/// Фоновая задача для периодического запуска Reconciliation Job.
/// Обработка зависших задач.
/// </summary>
internal class ReconciliationHostedService : BackgroundService
{
// Это реализация воркера, подключается напрямую в воркер
private readonly ILogger<ReconciliationHostedService> logger;
private readonly IReconciliationSettings reconciliationSettings;
private readonly IServiceProvider serviceProvider;
private readonly IIntervalService intervalService;
public ReconciliationHostedService(
ILogger<ReconciliationHostedService> logger,
IReconciliationSettings reconciliationSettings,
IServiceProvider serviceProvider,
IIntervalService intervalService
)
{
this.logger = logger;
this.reconciliationSettings = reconciliationSettings;
this.serviceProvider = serviceProvider;
this.intervalService = intervalService;
}
protected override async System.Threading.Tasks.Task ExecuteAsync(CancellationToken stoppingToken)
{
await intervalService.IntervalInitAsync(async () =>
{
await using (var scope = serviceProvider.CreateAsyncScope())
{
var reconciliationService = scope.ServiceProvider.GetRequiredService<ITaskReconciliationService>();
// Запускаем проверку
var report = await reconciliationService.RunAsync();
if (report.HasChanged)
logger.LogInformation("Reconciliation Job выполнен. Проверено: {Checked}, Исправлено: {Fixed}", report.CheckedCount, report.FixedCount);
}
}, reconciliationSettings.CheckInterval);
}
}
}