【问题标题】:RabbitMQ: How multiple consumers can receive messages from the same queue?RabbitMQ:多个消费者如何从同一个队列接收消息?
【发布时间】:2021-11-29 12:48:08
【问题描述】:

我运行生产者,它生成 N 条消息,我在仪表板上看到它们。 当我运行接收器时,它会接收来自队列的所有消息,并且队列是空的。

    static void Receive(string QueName)
    {
        ConnectionFactory connectionFactory = new ConnectionFactory
        {
            HostName = HostName,
            UserName = UserName,
            Password = Password,
        };
        var connection = connectionFactory.CreateConnection();
        var channel = connection.CreateModel();
        channel.BasicQos(0, 1, false);
        MessageReceiver messageReceiver = new MessageReceiver(channel);
        channel.BasicConsume(QueName, false, messageReceiver);
        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }

// Receiver
 public class MessageReceiver : DefaultBasicConsumer
    {
        private readonly IModel _channel;
        public MessageReceiver(IModel channel)
        {
            _channel = channel;
        }
        public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, ReadOnlyMemory<byte> body)
        {
            Console.WriteLine($"------------------------------");
            Console.WriteLine($"Consuming Message");
            Console.WriteLine(string.Concat("Message received from the exchange ", exchange));
            Console.WriteLine(string.Concat("Consumer tag: ", consumerTag));
            Console.WriteLine(string.Concat("Delivery tag: ", deliveryTag));
            Console.WriteLine(string.Concat("Routing tag: ", routingKey));
            //Console.WriteLine(string.Concat("Message: ", Encoding.UTF8.GetString(body)));

            var message = Encoding.UTF8.GetString(body.ToArray());
            Console.WriteLine(string.Concat("Message: ", message));
            Console.WriteLine($"------------------------------");
            _channel.BasicAck(deliveryTag, false);
        }
    }

我需要多个生产者向同一个队列生成消息。 多个客户从队列中接收消息。并且消息将被队列 TTL 删除。 但是现在第一个接收者从队列中获取所有消息。 我该怎么做?

【问题讨论】:

标签: c# rabbitmq


【解决方案1】:

最好的解决方案是:每个客户端都应该有自己的队列,可以带TTL,也可以带过期参数。

【讨论】: