feat(dal, core, workloadBuilderWorker): Сервисы по работе с очередями (задачиами). Заготовка WorkloadBuilderWorker

This commit is contained in:
Mikhail Trubnikov
2026-04-21 16:54:39 +10:00
parent 2a6fd7177d
commit 001c09edaa
22 changed files with 762 additions and 4 deletions

View File

@@ -0,0 +1,84 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces;
using PARR.Core.Common.Interfaces.RabbitServices;
using PARR.Core.Services.Task.Handlers;
using PARR.Core.Services.Task.Handlers.Factory;
using PARR.Core.Services.Workload.Interfaces;
using PARR.Domain.Common.Rabbit.Messages;
using PARR.Domain.Enums;
using PARR.Domain.Settings;
namespace PARR.Core.Services.Workload.Implementations
{
internal class WorkloadCacheBuilderService : IWorkloadCacheBuilderService
{
private readonly ILogger<WorkloadCacheBuilderService> logger;
private readonly IRabbitService rabbitService;
private readonly ITransformService transformService;
private readonly IServiceProvider serviceProvider;
public WorkloadCacheBuilderService(
ILogger<WorkloadCacheBuilderService> logger,
IRabbitService rabbitService,
ITransformService transformService,
IServiceProvider serviceProvider
)
{
this.logger = logger;
this.rabbitService = rabbitService;
this.transformService = transformService;
this.serviceProvider = serviceProvider;
}
public async System.Threading.Tasks.Task ProcessMessagesAsync(IMqSettings mqSettings)
{
// этот метод вызывается в воркере
var isConnected = await rabbitService.InitConsumerAsync(mqSettings, async (msg) =>
{
logger.LogInformation($"Получили запрос: {msg}");
var queueMessage = transformService.GetModelFromJson<TaskMessage>(msg);
if (queueMessage == null)
return;
// Проверим тип сообщения, что он соответствует текущему сервису
if (queueMessage.TypeCode != TaskTypeEnum.Workload)
{
logger.LogError("Несоответствие типа: в очереди {Queue} получена задача типа {Actual}", mqSettings.QueueName, queueMessage.TypeCode);
return;
}
using (var scope = serviceProvider.CreateScope())
{
var handlerFactory = scope.ServiceProvider.GetRequiredService<ITaskHandlerFactory>();
var handler = handlerFactory.GetHandler(queueMessage.TypeCode);
var result = await handler.ProcessAsync(queueMessage.TaskId);
// Если ошибка и есть retry — отправляем в очередь с задержкой
if (!result.IsSuccess && handler is BaseTaskHandler baseHandler)
{
// TODO:
// Если ошибка и есть retry — отправляем в очередь с задержкой
// (это упрощенная реализация, в идеале — через ITaskQueueService)
// Здесь нужна логика retry с задержкой
// Можно реализовать через отдельный сервис
}
}
});
if (!isConnected)
throw new Exception("Ошибка при подключении к RabbitMq");
}
public async System.Threading.Tasks.Task StopProcessingAsync()
{
await rabbitService.DisposeAsync();
}
}
}