[英]Why is only one RabbitMQ consumer receiving all the messages when I have two consumer threads going?
我正在运行测试并试图让两个 RabbitMQ 消费者共享从队列中提取消息。 但是,每次我运行它时,只有一个订阅者/消费者处理所有消息。 为什么?
我有一个单独的进程,将 10 条示例消息放入队列。 我停止它,然后运行它。
class Program
{
static void Main(string[] args)
{
Task task1 = Task.Factory.StartNew(() => RabbitReceiver.PullFromQueue(2000));
Task task2 = Task.Factory.StartNew(() => RabbitReceiver.PullFromQueue(1000));
Task.WaitAll(task1, task2);
Console.WriteLine("Press any key to close.");
Console.ReadKey();
}
}
这是每个线程使用的消费者:
public static class RabbitReceiver
{
public static void PullFromQueue(int sleepTimeInMilliseconds)
{
string hostName = "localhost";
string queueName = "Sandbox.v1";
var factory = new ConnectionFactory { HostName = hostName, UserName = "guest", Password = "guest", Port = 6003 };
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
var arguments = new Dictionary<string, object>();
arguments.Add("x-message-ttl", 864000000); // Not sure why I have to specify this. Got an exception if I didn't.
channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: arguments);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, eventArgs) =>
{
var body = eventArgs.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Thread.Sleep(sleepTimeInMilliseconds);
// This should probably go in a finally block.
channel.BasicAck(eventArgs.DeliveryTag, false);
};
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
}
}
如果未设置BasicQos
,则会发生这种情况。 默认情况下,RabbitMQ 在消息进入队列时将所有消息分派给第一个消费者。 它不查看消费者未确认消息的数量。
您可以通过设置BasicQos
来更改此行为,这控制了消费者在确认之前可以接收的消息数量。
channel.BasicQos(0, 1, false);
参考: https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.