RabbitMQ 基本消费者

问题描述 投票:0回答:1

我正在消费一个rabbitMQ队列,但是当使用非异步操作时,我的消费方法只获取到一条消息,但在rabbit中却显示它们都被消费了?兔子的行为是这样的吗?我使用异步运算符并设法从队列中获取所有消息。

    private IEnumerable<ReceivedPaymentViewModel> GetMessageQueue()
    {
        var payments = new List<ReceivedPaymentViewModel>();

        using var channel = _rabbitConnection.CreateChannel();
        channel.QueueDeclare(queue: "PaymentProcessedQueue", durable: false, exclusive: false, autoDelete: false,
            arguments: null);

        var consumer = new EventingBasicConsumer(channel);
            
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            var messages = JsonSerializer.Deserialize<ReceivedPaymentViewModel>(message);

            if (messages != null)
                payments.Add(messages);
        };

        channel.BasicConsume(queue: "PaymentProcessedQueue", autoAck: true, consumer: consumer);
            
        channel.Close();

        return payments;
    } 


Get messages in the rabbitMQ queue
c# .net rabbitmq .net-8.0
1个回答
0
投票

您将自动确认您的队列项目,如下所述:

channel.BasicConsume(queue: "PaymentProcessedQueue", *autoAck: true*, consumer: consumer);

因此,一旦您的消费者阅读了一条消息,它将被设置为“已完成”。

更改为autoAck: false

而是将以下内容插入到您的接收方法中:

consumer.Received += async (model, ea) => {
  ...
  await channel.BasicAckAsync(args.DeliveryTag, multiple: false);
}

只有在您的方法成功退出后才会确认消息。

© www.soinside.com 2019 - 2024. All rights reserved.