feat(docker, api, core, dal, domain, workloadBuilder): WorkloadBuillder - формирование кэша по интервалу.

This commit is contained in:
Mikhail Trubnikov
2026-05-19 09:45:38 +10:00
parent e5535857d4
commit 178d136dba
16 changed files with 180 additions and 11 deletions

View File

@@ -84,6 +84,8 @@ namespace PARR.Core
services.AddScoped<WorkloadCacheService>();
services.AddScoped<IWorkloadService, WorkloadService>();
services.AddSingleton<IWorkloadIntervalService, WorkloadIntervalService>();
#endregion
#region NextRun

View File

@@ -11,7 +11,8 @@ namespace PARR.Core.Services.TaskServices.Interfaces
public interface ITaskManagementService
{
/// <summary>
/// Создать новую задачу в БД и опубликовать в очередь
/// Создать новую задачу в БД и опубликовать в очередь.
/// В случае ошибок генерирует Exception.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="typeCode">Тип задачи</param>

View File

@@ -0,0 +1,55 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces;
using PARR.Core.Services.TaskServices.Interfaces;
using PARR.Core.Services.Workload.Interfaces;
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Settings;
namespace PARR.Core.Services.Workload.Implementations
{
internal class WorkloadIntervalService : IWorkloadIntervalService
{
private readonly ILogger<WorkloadIntervalService> logger;
private readonly IIntervalService intervalService;
private readonly IServiceProvider serviceProvider;
public WorkloadIntervalService(
ILogger<WorkloadIntervalService> logger,
IIntervalService intervalService,
IServiceProvider serviceProvider
)
{
this.logger = logger;
this.intervalService = intervalService;
this.serviceProvider = serviceProvider;
}
public async Task StartAsync(TimeSpan interval, IMqSettings mqSettings)
{
logger.LogInformation("Запуск сервиса формирования кэш отчетов Workload по интервалу.");
await intervalService.IntervalInitAsync(async () =>
{
await using (var scope = serviceProvider.CreateAsyncScope())
{
var taskManagementService = scope.ServiceProvider.GetRequiredService<ITaskManagementService>();
var initiator = new HistoryInitiator { InitiatorParrComponentId = Domain.Enums.ParrComponentsEnum.WorkloadBuilder, InitiatorComment = $"Генерация кэш workload по интервалу '{interval}'" };
try
{
var taskId = await taskManagementService.CreateTaskAsync<object?>(Domain.Enums.TaskTypeEnum.Workload, default, initiator, mqSettings);
logger.LogInformation("Создана задача {taskId} на формирование кэш отчета.", taskId);
}
catch (Exception ex)
{
logger.LogError(ex, "Ошибка при отправке задания на формирование кэш отчета.");
}
}
}, interval);
}
}
}

View File

@@ -0,0 +1,18 @@
using PARR.Domain.Settings;
namespace PARR.Core.Services.Workload.Interfaces
{
/// <summary>
/// Формирование кэш отчетов по интервалу
/// </summary>
public interface IWorkloadIntervalService
{
/// <summary>
/// Запуск формирования по интервалу
/// </summary>
/// <param name="interval">Интервал</param>
/// <param name="mqSettings">Настройки очереди куда отправлять задание</param>
/// <returns></returns>
Task StartAsync(TimeSpan interval, IMqSettings mqSettings);
}
}