Я использовал Rabbit MQ для обработки сообщений в последовательном порядке.Теперь у меня есть сценарий, где не нужно сразу принимать сообщения, но я хотел бы получать / читать сообщения из MQ каждые 1 (х) минут с размером пакета 20 (у)
, поэтому я могу обработатьэто 20 сообщений за один раз и сохранить в БД за один вызов вместо 20 раз для каждого сообщения.
Итак, как получать / получать сообщения в пакетном режиме на каждом интервале x.
У меня естьвидел следующую информацию, Использование сообщений в пакетном режиме - RabbitMQ и Rabbitmq получают несколько сообщений с помощью одного синхронного вызова с использованием .NET
Я пытался реализовать реализацию 2-го вопроса (Вопросы /32309155) но не работает, не понял, "потребитель. Получено" получит ** _ fetchSize ==> 20 ** значит, он получит 20 сообщений за одно чтение?или как это будет работать, потому что я изменил размер fetchsize на 10, но consumer.received получает одно сообщение.
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.BasicQos(0, 1, false);
channel.ExchangeDeclare("helloExchange", type:"direct");
channel.QueueDeclare(queue: "hello", durable: true, exclusive: false, autoDelete: false,
arguments: null);
channel.QueueBind("hello", "helloExchange", routingKey:"hello");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
bool canAck = false;
var retryCount = 0;
try
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
// DO PROCESS MESSAGE HERE
Console.WriteLine($"{typeof(MyConsumer).Name} Message consumed {message}");
canAck = true;
}
catch (Exception ex)
{canAck = false;
// LOG ERROR
}
try
{
if (canAck)
{
channel.BasicAck(ea.DeliveryTag, false);
}
else
{
channel.BasicNack(ea.DeliveryTag, false, false);
}
}
catch (AlreadyClosedException ex)
{
Console.WriteLine(ex.Message + " >> RabbitMQ is closed!");
}
};
channel.BasicConsume(queue: "hello", autoAck: false, consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}