using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.JobAutoControl.Settings; using System.Text.Json; namespace PARR.JobAutoControl { internal class JobAutoControlManager : IJobAutoControlManager { private readonly WorkerSettings workerSettings; private readonly ILogger logger; private readonly IIntervalService intervalService; private readonly IServiceProvider serviceProvider; private readonly MqSettings mqSettings; public JobAutoControlManager( WorkerSettings workerSettings, ILogger logger, IIntervalService intervalService, IServiceProvider serviceProvider, MqSettings mqSettings ) { this.workerSettings = workerSettings; this.logger = logger; this.intervalService = intervalService; this.serviceProvider = serviceProvider; this.mqSettings = mqSettings; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса управления авто-контролем РР (JobAutoControl)"); await intervalService.IntervalInitAsync(async () => { await using (var scope = serviceProvider.CreateAsyncScope()) //using (var scope = serviceProvider.CreateScope()) { var jobAutoControlService = scope.ServiceProvider.GetService(); var mqService = scope.ServiceProvider.GetService(); if (jobAutoControlService == null || mqService == null) throw new Exception($"Не смог получить серивс {nameof(IJobAutoControlService)} или {nameof(IMqService)}"); await HandlerAsync(jobAutoControlService, mqService); } }, workerSettings.RepeatEvery); } private async Task HandlerAsync(IJobAutoControlService jobAutoControlService, IMqService mqService) { var jobsWithAutoControl = await jobAutoControlService.Get().Where(t => t.IsEnable).ToListAsync(); logger.LogInformation($"Работ с включенным авто-контролем: {jobsWithAutoControl.Count} шт."); if (jobsWithAutoControl.Count == 0) return; // формируем сообщения var msgList = jobsWithAutoControl.Select(t => new TemplateMatcherMq { Action = Constants.TemplateMatcherActionEnum.Sync, EntityType = Constants.SyncTaskEntityTypeEnum.Job, Id = t.JobId, Initiator = new Common.Domain.HistoryInitiator { InitiatorComment = $"Инициатор авто-контроль, периодичность: {workerSettings.RepeatEvery}", InitiatorIp = null, InitiatorParrComponentId = Constants.ParrComponentsEnum.JobAutoControl } }); var msgStrList = msgList.Select(t => JsonSerializer.Serialize(t)); // отправляем задания в очередь template matcher`a var sendResult = await mqService.SendAsync(mqSettings.TemplateMatcher, msgStrList.ToArray()); if (!sendResult.IsSuccess) logger.LogError($"Ошибка при отправке сообщений ({msgStrList.Count()} шт.) в очередь."); else logger.LogInformation($"Выполнена отправка сообщений в очередь, {msgStrList.Count()} шт."); } } }