using Hangfire; using Microsoft.Extensions.Logging; namespace Tnsu.ApprovalRoute.Application.Approvals; /// /// Рекуррентная задача автосогласования — тонкая обёртка над /// : всё, что она добавляет сверху, — расписание, /// защита от наложения запусков и одна строка в логе с итогом. /// /// Повторы отключены (Attempts = 0) намеренно, в отличие от /// CreateNextListPartitionJob: там повтор нужен, потому что пропуск задачи ломает /// сценарий целиком (список не создан — писать некуда). Здесь же следующий запуск /// придёт сам, через час, и сделает ровно ту же работу с актуальным состоянием — /// уже согласованные строки в выборку не попадут. Повторять упавший проход раньше /// этого смысла нет, а висящие в очереди повторы только прятали бы настоящую /// причину сбоя. /// [AutomaticRetry(Attempts = 0)] [DisableConcurrentExecution(timeoutInSeconds: 5 * 60)] public sealed class AutoApproveJob(AutoApproveService service, ILogger logger) { /// /// Идентификатор рекуррентной задачи в Hangfire. Константой — по нему задача и /// заводится, и снимается при выключении настройки (см. Program.cs): разъехавшись, /// эти два имени оставили бы в дашборде задачу, которую уже некому снять. /// public const string RecurringJobId = "auto-approve"; public async Task RunAsync(CancellationToken cancellationToken) { var approved = await service.RunAsync(cancellationToken); logger.LogInformation("Автосогласование: строк согласовано автоматически — {Count}", approved); } }