feat(bll): обновлен MqServiceV2, добавлена обработка ошибок при выполнение делегата. Обновлен image rabbitMq до версии 4.2.0

This commit is contained in:
Mikhail Trubnikov
2025-11-17 15:36:24 +10:00
parent e24ce20d02
commit a7f7e732f6
3 changed files with 32 additions and 14 deletions

View File

@@ -75,12 +75,26 @@ namespace PARR.BLL.Services.Implementations
consumer.ReceivedAsync += async (ch, ea) =>
{
var content = Encoding.UTF8.GetString(ea.Body.ToArray());
//var content = Encoding.UTF8.GetString(ea.Body.ToArray());
var content = Encoding.UTF8.GetString(ea.Body.Span);
logger.LogDebug($"Получено сообщение: {content}");
await messageHandler.Invoke(content);
try
{
await messageHandler.Invoke(content);
await consumerChannel.BasicAckAsync(ea.DeliveryTag, false);
}
catch (Exception ex)
{
logger.LogError(ex, $"Ошибка при обработке сообщения: {content}");
await consumerChannel.BasicAckAsync(ea.DeliveryTag, false);
//requeue: true - сообщение возвращаем в очередь в случае ошибки. Это немного опасно,
// если ошибка в формате сообщения, то она никогда не устранится и вечно будет добавляться/удаляться в очередь
//todo: тут можно реализовать DLQ с кол-вом попыток, после не успешных попыток, перемещать эти сообщения в другую очередь
// сделал false, выбрасывать на свежий воздух куда подальше эти кривые сообщения которые обработал с ошибками
await consumerChannel.BasicNackAsync(ea.DeliveryTag, false, requeue: false);
//await consumerChannel.BasicNackAsync(ea.DeliveryTag, false, requeue: true);
}
};
var consumerTag = await consumerChannel.BasicConsumeAsync(mqSettings.QueueName, false, consumer);
@@ -124,6 +138,12 @@ namespace PARR.BLL.Services.Implementations
//props.Expiration = "60000";
props.ContentType = "text/plain";//"application/json";
channel.BasicReturnAsync += async (sender, ea) =>
{
var body = Encoding.UTF8.GetString(ea.Body.Span);
logger.LogWarning($"Сообщение не было доставлено в очередь: {ea.Exchange} -> {ea.RoutingKey}. Тело: {body}");
};
foreach (var msg in msgList)
{
var body = Encoding.UTF8.GetBytes(msg);
@@ -157,11 +177,13 @@ namespace PARR.BLL.Services.Implementations
}
}
private async Task QueueDeclareAsync(IChannel channel, IMqSettings mqSettings)
{
//https://www.rabbitmq.com/lazy-queues.html
// lazy - ленивой очереди больше нет
var args = new Dictionary<string, object?> { { "x-queue-mode", "lazy" } };
//var args = new Dictionary<string, object?> { { "x-queue-mode", "lazy" } };
var args = new Dictionary<string, object?> { };
//Объявляем очередь с которой будем работать.
//Если такой очереди ещё нет, то создатся.