feat(dal, core, workloadBuilderWorker): Сервисы по работе с очередями (задачиами). Заготовка WorkloadBuilderWorker
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user