RabbitMQ 将在确认后决定何时删除消息。
假设您有一个消息发件人:
var factory = new ConnectionFactory() { HostName = "localhost", Port = 5672, UserName = "guest", Password = "guest" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
这将创建一个持久队列“hello”并发送消息“Hello World!” 给它。这是向队列发送一条消息后的样子。
现在让我们设置两个消费者,一个确认收到了消息,一个确认没有收到。
channel.BasicConsume(queue: "hello",
autoAck: false,
consumer: consumer);
和
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
如果只运行第一个消费者,则消息永远不会从队列中删除,因为消费者声明只有客户端手动确认消息才会从队列中消失:https://www.rabbitmq.com/confirms。 html
然而,第二个消费者将告诉队列它可以安全地自动/立即删除它收到的所有消息。
如果您不想自动删除这些消息,则必须禁用 autoAck 并使用文档进行一些手动确认:
http://codingvision.net/tips-and-tricks/c-send-data-between-processes-w-memory-mapped-file(向下滚动到“手动确认”)。
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);