我正在消费一个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
您将自动确认您的队列项目,如下所述:
channel.BasicConsume(queue: "PaymentProcessedQueue", *autoAck: true*, consumer: consumer);
因此,一旦您的消费者阅读了一条消息,它将被设置为“已完成”。
更改为autoAck: false
而是将以下内容插入到您的接收方法中:
consumer.Received += async (model, ea) => {
...
await channel.BasicAckAsync(args.DeliveryTag, multiple: false);
}
只有在您的方法成功退出后才会确认消息。